diff --git a/base/env/dune_bk.tga b/base/env/dune_bk.tga new file mode 100644 index 00000000..45d4126a Binary files /dev/null and b/base/env/dune_bk.tga differ diff --git a/base/env/dune_dn.tga b/base/env/dune_dn.tga new file mode 100644 index 00000000..7454587e Binary files /dev/null and b/base/env/dune_dn.tga differ diff --git a/base/env/dune_ft.tga b/base/env/dune_ft.tga new file mode 100644 index 00000000..c3532e63 Binary files /dev/null and b/base/env/dune_ft.tga differ diff --git a/base/env/dune_lf.tga b/base/env/dune_lf.tga new file mode 100644 index 00000000..0474fc87 Binary files /dev/null and b/base/env/dune_lf.tga differ diff --git a/base/env/dune_rt.tga b/base/env/dune_rt.tga new file mode 100644 index 00000000..8e8bf771 Binary files /dev/null and b/base/env/dune_rt.tga differ diff --git a/base/env/dune_up.tga b/base/env/dune_up.tga new file mode 100644 index 00000000..6afb3f2e Binary files /dev/null and b/base/env/dune_up.tga differ diff --git a/base/maps/ai.bsp b/base/maps/ai.bsp index 7e7e3efc..7ffbf621 100644 Binary files a/base/maps/ai.bsp and b/base/maps/ai.bsp differ diff --git a/base/maps/dlights.bsp b/base/maps/dlights.bsp index e879aef3..25589e58 100644 Binary files a/base/maps/dlights.bsp and b/base/maps/dlights.bsp differ diff --git a/base/maps/hdr.bsp b/base/maps/hdr.bsp index 68bf579d..bec776b4 100644 Binary files a/base/maps/hdr.bsp and b/base/maps/hdr.bsp differ diff --git a/base/maps/lean.bsp b/base/maps/lean.bsp index 026c100a..ccce0383 100644 Binary files a/base/maps/lean.bsp and b/base/maps/lean.bsp differ diff --git a/base/maps/particles.bsp b/base/maps/particles.bsp index 112ef3fe..6f031394 100644 Binary files a/base/maps/particles.bsp and b/base/maps/particles.bsp differ diff --git a/base/mapsrc/ai.map b/base/mapsrc/ai.map index 15036e9f..b45661eb 100644 --- a/base/mapsrc/ai.map +++ b/base/mapsrc/ai.map @@ -1,14 +1,15 @@ // entity 0 { +"skyname" "dune" "classname" "worldspawn" // brush 0 { -( -1536 -512 544 ) ( 1824 512 544 ) ( 1824 -512 544 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 -( -1536 512 544 ) ( 1824 512 512 ) ( 1824 512 544 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 -( 1824 512 544 ) ( 1824 -512 512 ) ( 1824 -512 544 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 -( -1536 -512 544 ) ( 1824 -512 544 ) ( 1824 -512 512 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 -( -1536 512 512 ) ( -1536 -512 544 ) ( -1536 -512 512 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 -( -1536 -512 512 ) ( 1824 -512 512 ) ( 1824 512 512 ) skybox/dune 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -512 544 ) ( 1824 512 544 ) ( 1824 -512 544 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 +( -1536 512 544 ) ( 1824 512 512 ) ( 1824 512 544 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 +( 1824 512 544 ) ( 1824 -512 512 ) ( 1824 -512 544 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -512 544 ) ( 1824 -512 544 ) ( 1824 -512 512 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 +( -1536 512 512 ) ( -1536 -512 544 ) ( -1536 -512 512 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -512 512 ) ( 1824 -512 512 ) ( 1824 512 512 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 } // brush 1 { @@ -57,78 +58,6 @@ } // brush 6 { -( -368 320 256 ) ( -368 256 256 ) ( -400 320 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -368 288 128 ) ( -400 288 128 ) ( -368 288 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -384 320 128 ) ( -384 320 0 ) ( -384 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -400 256 0 ) ( -368 256 0 ) ( -400 320 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 258 0 ) ( -400 258 128 ) ( -368 258 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 256 0 ) ( -400 320 0 ) ( -400 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 7 -{ -( -368 160 256 ) ( -368 96 256 ) ( -400 160 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -368 128 128 ) ( -400 128 128 ) ( -368 128 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -384 160 128 ) ( -384 160 0 ) ( -384 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -400 96 0 ) ( -368 96 0 ) ( -400 160 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 98 0 ) ( -400 98 128 ) ( -368 98 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 96 0 ) ( -400 160 0 ) ( -400 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 8 -{ -( -368 -96 256 ) ( -368 -160 256 ) ( -400 -96 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -368 -128 128 ) ( -400 -128 128 ) ( -368 -128 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -384 -96 128 ) ( -384 -96 0 ) ( -384 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -400 -160 0 ) ( -368 -160 0 ) ( -400 -96 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 -158 0 ) ( -400 -158 128 ) ( -368 -158 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 -160 0 ) ( -400 -96 0 ) ( -400 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 9 -{ -( -368 -256 256 ) ( -368 -320 256 ) ( -400 -256 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -368 -288 128 ) ( -400 -288 128 ) ( -368 -288 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -384 -256 128 ) ( -384 -256 0 ) ( -384 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -400 -320 0 ) ( -368 -320 0 ) ( -400 -256 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 -318 0 ) ( -400 -318 128 ) ( -368 -318 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 -( -400 -320 0 ) ( -400 -256 0 ) ( -400 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 10 -{ -( -448 320 256 ) ( -448 256 256 ) ( -480 320 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -448 288 128 ) ( -480 288 128 ) ( -448 288 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -464 320 128 ) ( -464 320 0 ) ( -464 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 256 0 ) ( -448 256 0 ) ( -480 320 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 258 0 ) ( -480 258 128 ) ( -448 258 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 256 0 ) ( -480 320 0 ) ( -480 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 11 -{ -( -448 160 256 ) ( -448 96 256 ) ( -480 160 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -448 128 128 ) ( -480 128 128 ) ( -448 128 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -464 160 128 ) ( -464 160 0 ) ( -464 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 96 0 ) ( -448 96 0 ) ( -480 160 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 98 0 ) ( -480 98 128 ) ( -448 98 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 96 0 ) ( -480 160 0 ) ( -480 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 12 -{ -( -448 -96 256 ) ( -448 -160 256 ) ( -480 -96 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -448 -128 128 ) ( -480 -128 128 ) ( -448 -128 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -464 -96 128 ) ( -464 -96 0 ) ( -464 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -160 0 ) ( -448 -160 0 ) ( -480 -96 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -158 0 ) ( -480 -158 128 ) ( -448 -158 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -160 0 ) ( -480 -96 0 ) ( -480 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 13 -{ -( -448 -256 256 ) ( -448 -320 256 ) ( -480 -256 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -448 -288 128 ) ( -480 -288 128 ) ( -448 -288 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -464 -256 128 ) ( -464 -256 0 ) ( -464 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -320 0 ) ( -448 -320 0 ) ( -480 -256 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -318 0 ) ( -480 -318 128 ) ( -448 -318 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -( -480 -320 0 ) ( -480 -256 0 ) ( -480 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 -} -// brush 14 -{ ( 1824 512 0 ) ( 1824 -512 512 ) ( 1824 -512 0 ) dev/dev_measurewall01c 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 -128 512 ) ( 1856 -128 512 ) ( 1856 -128 0 ) dev/dev_measurewall01c 48 0 0 -0.250000 0.250000 0 0 0 ( 1856 512 0 ) ( 1824 -512 0 ) ( 1856 -512 0 ) dev/dev_measurewall01c 32 0 0 -0.250000 0.250000 0 0 0 @@ -136,7 +65,7 @@ ( 1848 0 512 ) ( 1880 0 0 ) ( 1880 0 512 ) dev/dev_measurewall01c 48 0 0 -0.250000 0.250000 0 0 0 ( 1824 512 128 ) ( 1856 -512 128 ) ( 1824 -512 128 ) dev/dev_measurewall01c 0 0 0 -0.250000 0.250000 0 0 0 } -// brush 15 +// brush 7 { ( 1824 512 128 ) ( 1856 -512 128 ) ( 1824 -512 128 ) dev/dev_measurewall01b 0 0 0 -0.250000 0.250000 0 0 0 ( 1832 128 512 ) ( 1864 128 0 ) ( 1864 128 512 ) dev/dev_measurewall01b 48 0 0 -0.250000 0.250000 0 0 0 @@ -145,7 +74,7 @@ ( 1824 0 512 ) ( 1856 0 512 ) ( 1856 0 0 ) dev/dev_measurewall01b 48 0 0 -0.250000 0.250000 0 0 0 ( 1824 512 0 ) ( 1824 -512 512 ) ( 1824 -512 0 ) dev/dev_measurewall01b 0 0 0 -0.250000 0.250000 0 0 0 } -// brush 16 +// brush 8 { ( 1824 640 0 ) ( 1824 -384 512 ) ( 1824 -384 0 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 128 512 ) ( 1856 128 512 ) ( 1856 128 0 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 @@ -154,7 +83,7 @@ ( 1864 512 512 ) ( 1896 512 0 ) ( 1896 512 512 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 640 128 ) ( 1856 -384 128 ) ( 1824 -384 128 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 } -// brush 17 +// brush 9 { ( 1824 512 128 ) ( 1856 -512 128 ) ( 1824 -512 128 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 ( 1864 -128 512 ) ( 1896 -128 0 ) ( 1896 -128 512 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 @@ -163,7 +92,7 @@ ( 1824 -512 512 ) ( 1856 -512 512 ) ( 1856 -512 0 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 512 0 ) ( 1824 -512 512 ) ( 1824 -512 0 ) dev/dev_measurewall01d 0 0 0 -0.250000 0.250000 0 0 0 } -// brush 18 +// brush 10 { ( -1536 512 512 ) ( 1824 512 512 ) ( 1824 512 0 ) dev/dev_measurewall01a -128 0 0 0.250000 0.250000 0 0 0 ( -1536 544 0 ) ( -1536 512 512 ) ( -1536 512 0 ) dev/dev_measurewall01a -128 0 0 0.250000 0.250000 0 0 0 @@ -172,7 +101,7 @@ ( -1536 544 512 ) ( 1824 544 0 ) ( 1824 544 512 ) dev/dev_measurewall01a -128 0 0 0.250000 0.250000 0 0 0 ( -1536 512 512 ) ( 1824 544 512 ) ( 1824 512 512 ) dev/dev_measurewall01a -128 0 0 0.250000 0.250000 0 0 0 } -// brush 19 +// brush 11 { ( 1824 512 0 ) ( 1824 -512 512 ) ( 1824 -512 0 ) dev/dev_measurewall01a 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 -512 512 ) ( 1856 -512 512 ) ( 1856 -512 0 ) dev/dev_measurewall01a 0 0 0 -0.250000 0.250000 0 0 0 @@ -181,7 +110,7 @@ ( 1824 512 512 ) ( 1856 512 0 ) ( 1856 512 512 ) dev/dev_measurewall01a 0 0 0 -0.250000 0.250000 0 0 0 ( 1824 512 512 ) ( 1856 -512 512 ) ( 1824 -512 512 ) dev/dev_measurewall01a 0 0 0 -0.250000 0.250000 0 0 0 } -// brush 20 +// brush 12 { ( -1536 512 512 ) ( -1536 -512 0 ) ( -1536 -512 512 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 ( -1568 512 0 ) ( -1568 -512 512 ) ( -1568 -512 0 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 @@ -190,7 +119,7 @@ ( -1568 512 512 ) ( -1536 512 0 ) ( -1536 512 512 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 ( -1568 512 512 ) ( -1536 -512 512 ) ( -1568 -512 512 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 } -// brush 21 +// brush 13 { ( -1536 -512 512 ) ( 1824 -512 0 ) ( 1824 -512 512 ) dev/dev_measurewall01a 128 0 0 -0.250000 0.250000 0 0 0 ( -1536 -544 512 ) ( -1536 -512 0 ) ( -1536 -512 512 ) dev/dev_measurewall01a 128 0 0 -0.250000 0.250000 0 0 0 @@ -590,3 +519,107 @@ "classname" "env_cubemap" "origin" "-432 0 328" } +// entity 27 +{ +"classname" "func_ladder" +// brush 0 +{ +( -368 -256 256 ) ( -368 -320 256 ) ( -400 -256 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -368 -288 128 ) ( -400 -288 128 ) ( -368 -288 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -384 -256 128 ) ( -384 -256 0 ) ( -384 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -400 -320 0 ) ( -368 -320 0 ) ( -400 -256 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 -318 0 ) ( -400 -318 128 ) ( -368 -318 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 -320 0 ) ( -400 -256 0 ) ( -400 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 28 +{ +"classname" "func_ladder" +// brush 0 +{ +( -368 -96 256 ) ( -368 -160 256 ) ( -400 -96 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -368 -128 128 ) ( -400 -128 128 ) ( -368 -128 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -384 -96 128 ) ( -384 -96 0 ) ( -384 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -400 -160 0 ) ( -368 -160 0 ) ( -400 -96 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 -158 0 ) ( -400 -158 128 ) ( -368 -158 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 -160 0 ) ( -400 -96 0 ) ( -400 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 29 +{ +"classname" "func_ladder" +// brush 0 +{ +( -368 160 256 ) ( -368 96 256 ) ( -400 160 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -368 128 128 ) ( -400 128 128 ) ( -368 128 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -384 160 128 ) ( -384 160 0 ) ( -384 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -400 96 0 ) ( -368 96 0 ) ( -400 160 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 98 0 ) ( -400 98 128 ) ( -368 98 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 96 0 ) ( -400 160 0 ) ( -400 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 30 +{ +"classname" "func_ladder" +// brush 0 +{ +( -368 320 256 ) ( -368 256 256 ) ( -400 320 256 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -368 288 128 ) ( -400 288 128 ) ( -368 288 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -384 320 128 ) ( -384 320 0 ) ( -384 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -400 256 0 ) ( -368 256 0 ) ( -400 320 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 258 0 ) ( -400 258 128 ) ( -368 258 0 ) common/climb 32 0 0 0.500000 0.500000 0 0 0 +( -400 256 0 ) ( -400 320 0 ) ( -400 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 31 +{ +"classname" "func_ladder" +// brush 0 +{ +( -448 -256 256 ) ( -448 -320 256 ) ( -480 -256 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -448 -288 128 ) ( -480 -288 128 ) ( -448 -288 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -464 -256 128 ) ( -464 -256 0 ) ( -464 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -320 0 ) ( -448 -320 0 ) ( -480 -256 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -318 0 ) ( -480 -318 128 ) ( -448 -318 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -320 0 ) ( -480 -256 0 ) ( -480 -320 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 32 +{ +"classname" "func_ladder" +// brush 0 +{ +( -448 -96 256 ) ( -448 -160 256 ) ( -480 -96 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -448 -128 128 ) ( -480 -128 128 ) ( -448 -128 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -464 -96 128 ) ( -464 -96 0 ) ( -464 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -160 0 ) ( -448 -160 0 ) ( -480 -96 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -158 0 ) ( -480 -158 128 ) ( -448 -158 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 -160 0 ) ( -480 -96 0 ) ( -480 -160 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 33 +{ +"classname" "func_ladder" +// brush 0 +{ +( -448 160 256 ) ( -448 96 256 ) ( -480 160 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -448 128 128 ) ( -480 128 128 ) ( -448 128 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -464 160 128 ) ( -464 160 0 ) ( -464 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 96 0 ) ( -448 96 0 ) ( -480 160 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 98 0 ) ( -480 98 128 ) ( -448 98 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 96 0 ) ( -480 160 0 ) ( -480 96 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 34 +{ +"classname" "func_ladder" +// brush 0 +{ +( -448 320 256 ) ( -448 256 256 ) ( -480 320 256 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -448 288 128 ) ( -480 288 128 ) ( -448 288 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -464 320 128 ) ( -464 320 0 ) ( -464 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 256 0 ) ( -448 256 0 ) ( -480 320 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 258 0 ) ( -480 258 128 ) ( -448 258 0 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +( -480 256 0 ) ( -480 320 0 ) ( -480 256 128 ) common/climb 0 0 0 0.500000 0.500000 0 0 0 +} +} diff --git a/base/mapsrc/dlights.map b/base/mapsrc/dlights.map index dd4630c0..ec3c77c5 100644 --- a/base/mapsrc/dlights.map +++ b/base/mapsrc/dlights.map @@ -3,165 +3,165 @@ "classname" "worldspawn" // brush 0 { -( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 ( -256 -192 0 ) ( -256 192 0 ) ( -256 -192 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 } // brush 1 { -( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) pbrtest/tiles052 0 0 0 0.250000 0.250000 0 0 0 -( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 ( -256 -192 256 ) ( -256 192 256 ) ( -256 -192 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 } // brush 2 { -( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 ( -320 -192 256 ) ( -320 192 256 ) ( -320 -192 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 3 { -( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 ( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 +( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 4 { -( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 192 256 264 ) ( -320 256 264 ) ( 192 256 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 ( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 192 256 264 ) ( -320 256 264 ) ( 192 256 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 5 { -( 248 -384 -64 ) ( 248 -768 -64 ) ( -264 -384 -64 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 -( 256 -384 8 ) ( -256 -384 8 ) ( 256 -384 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 -384 8 ) ( 256 -384 0 ) ( 256 -768 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -768 -128 ) ( 256 -768 -128 ) ( -256 -384 -128 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -768 0 ) ( -256 -768 8 ) ( 256 -768 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 ( -256 -768 0 ) ( -256 -384 0 ) ( -256 -768 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -768 0 ) ( -256 -768 8 ) ( 256 -768 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -768 -128 ) ( 256 -768 -128 ) ( -256 -384 -128 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 -384 8 ) ( 256 -384 0 ) ( 256 -768 8 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 -384 8 ) ( -256 -384 8 ) ( 256 -384 0 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 248 -384 -64 ) ( 248 -768 -64 ) ( -264 -384 -64 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 } // brush 6 { -( 248 -384 192 ) ( 248 -768 192 ) ( -264 -384 192 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 -384 264 ) ( -256 -384 264 ) ( 256 -384 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( 256 -384 264 ) ( 256 -384 256 ) ( 256 -768 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 -( -256 -768 128 ) ( 256 -768 128 ) ( -256 -384 128 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 -( -256 -768 256 ) ( -256 -768 264 ) ( 256 -768 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 ( -256 -768 256 ) ( -256 -384 256 ) ( -256 -768 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -768 256 ) ( -256 -768 264 ) ( 256 -768 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( -256 -768 128 ) ( 256 -768 128 ) ( -256 -384 128 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( 256 -384 264 ) ( 256 -384 256 ) ( 256 -768 264 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 256 -384 264 ) ( -256 -384 264 ) ( 256 -384 256 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 +( 248 -384 192 ) ( 248 -768 192 ) ( -264 -384 192 ) measure/floor 0 0 0 0.500000 0.500000 0 0 0 } // brush 7 { -( 184 -384 192 ) ( 184 -768 192 ) ( -328 -384 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 192 -384 264 ) ( -320 -384 264 ) ( 192 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -256 -384 8 ) ( -256 -384 0 ) ( -256 -768 8 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -768 -768 -128 ) ( -256 -768 -128 ) ( -768 -384 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( -320 -768 256 ) ( -320 -768 264 ) ( 192 -768 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 ( -320 -768 256 ) ( -320 -384 256 ) ( -320 -768 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( -320 -768 256 ) ( -320 -768 264 ) ( 192 -768 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -768 -768 -128 ) ( -256 -768 -128 ) ( -768 -384 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( -256 -384 8 ) ( -256 -384 0 ) ( -256 -768 8 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 192 -384 264 ) ( -320 -384 264 ) ( 192 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 184 -384 192 ) ( 184 -768 192 ) ( -328 -384 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 } // brush 8 { -( 760 -384 192 ) ( 760 -768 192 ) ( 248 -384 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 768 -384 264 ) ( 256 -384 264 ) ( 768 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 -384 8 ) ( 320 -384 0 ) ( 320 -768 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( -192 -768 -128 ) ( 320 -768 -128 ) ( -192 -384 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( 256 -768 256 ) ( 256 -384 256 ) ( 256 -768 264 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 ( 256 -768 256 ) ( 256 -768 264 ) ( 768 -768 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 256 -768 256 ) ( 256 -384 256 ) ( 256 -768 264 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( -192 -768 -128 ) ( 320 -768 -128 ) ( -192 -384 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( 320 -384 8 ) ( 320 -384 0 ) ( 320 -768 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 768 -384 264 ) ( 256 -384 264 ) ( 768 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 760 -384 192 ) ( 760 -768 192 ) ( 248 -384 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 } // brush 9 { -( 184 -768 192 ) ( 184 -1152 192 ) ( -328 -768 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 192 -768 264 ) ( -320 -768 264 ) ( 192 -768 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 320 -480 8 ) ( 320 -480 0 ) ( 320 -864 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( -768 -1152 -128 ) ( -256 -1152 -128 ) ( -768 -768 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 272 -832 256 ) ( 272 -832 264 ) ( 784 -832 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 ( -320 -1152 256 ) ( -320 -768 256 ) ( -320 -1152 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 272 -832 256 ) ( 272 -832 264 ) ( 784 -832 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -768 -1152 -128 ) ( -256 -1152 -128 ) ( -768 -768 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( 320 -480 8 ) ( 320 -480 0 ) ( 320 -864 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 192 -768 264 ) ( -320 -768 264 ) ( 192 -768 256 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 184 -768 192 ) ( 184 -1152 192 ) ( -328 -768 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 } // brush 10 { -( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 ( -56 -104 128 ) ( 80 -472 128 ) ( 80 -104 128 ) measure/wall64a 48 0 0 0.500000 0.500000 0 0 0 +( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 11 { -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 280 -320 256 ) ( 280 -320 264 ) ( 792 -320 256 ) measure/wall128gr 240 0 0 0.500000 0.500000 0 0 0 +( 72 -472 192 ) ( 72 -104 -128 ) ( 72 -104 192 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 ( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 -( 72 -472 192 ) ( 72 -104 -128 ) ( 72 -104 192 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 280 -320 256 ) ( 280 -320 264 ) ( 792 -320 256 ) measure/wall128gr 240 0 0 0.500000 0.500000 0 0 0 +( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 12 { -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 72 -104 192 ) ( 72 -104 -128 ) ( 72 -472 192 ) NULL 0 0 0 0.500000 0.500000 0 0 0 ( -72 -104 -64 ) ( 64 -472 -64 ) ( -72 -472 -64 ) measure/wall64a 16 0 0 0.500000 0.500000 0 0 0 +( 72 -104 192 ) ( 72 -104 -128 ) ( 72 -472 192 ) NULL 0 0 0 0.500000 0.500000 0 0 0 +( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 13 { -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 -( -72 -472 -64 ) ( 64 -472 -64 ) ( -72 -104 -64 ) NULL 16 0 0 0.500000 0.500000 0 0 0 ( -64 -472 192 ) ( -64 -104 -128 ) ( -64 -472 -128 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -72 -472 -64 ) ( 64 -472 -64 ) ( -72 -104 -64 ) NULL 16 0 0 0.500000 0.500000 0 0 0 +( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 +( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 272 -320 256 ) ( 272 -320 264 ) ( 784 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 14 { -( 184 -320 192 ) ( 184 -704 192 ) ( -328 -320 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 -32 8 ) ( 320 -32 0 ) ( 320 -416 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 ( -56 -104 128 ) ( 80 -472 128 ) ( 80 -104 128 ) measure/wall64a 48 0 0 0.500000 0.500000 0 0 0 +( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 320 -32 8 ) ( 320 -32 0 ) ( 320 -416 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( 184 -320 192 ) ( 184 -704 192 ) ( -328 -320 192 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 } // brush 15 { -( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 320 -32 8 ) ( 320 -32 0 ) ( 320 -416 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( -768 -704 -128 ) ( -256 -704 -128 ) ( -768 -320 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( 72 -472 192 ) ( 72 -104 -128 ) ( 72 -104 192 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 ( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 -( 72 -472 192 ) ( 72 -104 -128 ) ( 72 -104 192 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( -768 -704 -128 ) ( -256 -704 -128 ) ( -768 -320 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( 320 -32 8 ) ( 320 -32 0 ) ( 320 -416 8 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 16 { -( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -768 -704 -128 ) ( -256 -704 -128 ) ( -768 -320 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 -( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( 72 -104 192 ) ( 72 -104 -128 ) ( 72 -472 192 ) NULL 0 0 0 0.500000 0.500000 0 0 0 ( -72 -104 -64 ) ( 64 -472 -64 ) ( -72 -472 -64 ) measure/wall64a 16 0 0 0.500000 0.500000 0 0 0 +( 72 -104 192 ) ( 72 -104 -128 ) ( 72 -472 192 ) NULL 0 0 0 0.500000 0.500000 0 0 0 +( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 +( -768 -704 -128 ) ( -256 -704 -128 ) ( -768 -320 -128 ) measure/wall128gr 0 128 0 0.500000 0.500000 0 0 0 +( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } // brush 17 { -( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 -( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 -( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 -( -72 -472 -64 ) ( 64 -472 -64 ) ( -72 -104 -64 ) NULL 16 0 0 0.500000 0.500000 0 0 0 ( -64 -472 192 ) ( -64 -104 -128 ) ( -64 -472 -128 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -72 -472 -64 ) ( 64 -472 -64 ) ( -72 -104 -64 ) NULL 16 0 0 0.500000 0.500000 0 0 0 +( 80 -104 128 ) ( 80 -472 128 ) ( -56 -104 128 ) NULL 48 0 0 0.500000 0.500000 0 0 0 +( -320 -704 256 ) ( -320 -320 256 ) ( -320 -704 264 ) measure/wall128gr 128 0 0 0.500000 0.500000 0 0 0 +( 272 -384 256 ) ( 272 -384 264 ) ( 784 -384 256 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 192 -320 264 ) ( -320 -320 264 ) ( 192 -320 256 ) measure/wall128gr 0 0 0 0.500000 0.500000 0 0 0 } } // entity 1 @@ -174,202 +174,202 @@ } // entity 3 { -"classname" "func_button" "target" "foobar2" +"classname" "func_button" // brush 0 { -( 88 -40 0 ) ( 88 -80 0 ) ( 48 -40 0 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 88 -48 72 ) ( 48 -48 72 ) ( 88 -48 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 80 -40 72 ) ( 80 -40 64 ) ( 80 -80 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 48 -80 -64 ) ( 88 -80 -64 ) ( 48 -40 -64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 40 -80 64 ) ( 40 -80 72 ) ( 80 -80 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 ( 48 -80 64 ) ( 48 -40 64 ) ( 48 -80 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 40 -80 64 ) ( 40 -80 72 ) ( 80 -80 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 48 -80 -64 ) ( 88 -80 -64 ) ( 48 -40 -64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 80 -40 72 ) ( 80 -40 64 ) ( 80 -80 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 88 -48 72 ) ( 48 -48 72 ) ( 88 -48 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 88 -40 0 ) ( 88 -80 0 ) ( 48 -40 0 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 } } // entity 4 { -"classname" "func_button" "target" "foobar1" +"classname" "func_button" // brush 0 { -( 88 152 0 ) ( 88 112 0 ) ( 48 152 0 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 88 144 72 ) ( 48 144 72 ) ( 88 144 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 80 152 72 ) ( 80 152 64 ) ( 80 112 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 48 112 -64 ) ( 88 112 -64 ) ( 48 152 -64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 -( 40 112 64 ) ( 40 112 72 ) ( 80 112 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 ( 48 112 64 ) ( 48 152 64 ) ( 48 112 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 40 112 64 ) ( 40 112 72 ) ( 80 112 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 48 112 -64 ) ( 88 112 -64 ) ( 48 152 -64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 80 152 72 ) ( 80 152 64 ) ( 80 112 72 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 88 144 72 ) ( 48 144 72 ) ( 88 144 64 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 +( 88 152 0 ) ( 88 112 0 ) ( 48 152 0 ) next/rusty7 0 0 0 0.500000 0.500000 0 0 0 } } // entity 5 { -"classname" "point_message" -"origin" "-160.000000 128.000000 32.000000" "message" "White dynamic light with no style pattern." +"origin" "-160.000000 128.000000 32.000000" +"classname" "point_message" } // entity 6 { -"classname" "light_dynamic" -"origin" "-192.000000 128.000000 64.000000" -"_light" "255 255 255" "brightness" "250" +"_light" "255 255 255" +"origin" "-192.000000 128.000000 64.000000" +"classname" "light_dynamic" } // entity 7 { -"classname" "point_message" -"origin" "-160.000000 -64.000000 32.000000" "message" "Small blinking yellow dynamic light." +"origin" "-160.000000 -64.000000 32.000000" +"classname" "point_message" } // entity 8 { -"classname" "light_dynamic" -"origin" "-192.000000 -64.000000 64.000000" -"pattern" "zm" -"_light" "255 255 128" "brightness" "150" +"_light" "255 255 128" +"pattern" "zm" +"origin" "-192.000000 -64.000000 64.000000" +"classname" "light_dynamic" } // entity 9 { -"classname" "point_message" -"origin" "120.000000 128.000000 32.000000" "message" "Toggable white flickering dynamic light." +"origin" "120.000000 128.000000 32.000000" +"classname" "point_message" } // entity 10 { -"classname" "light_dynamic" -"origin" "192.000000 128.000000 64.000000" -"targetname" "foobar1" -"style" "1" -"_light" "255 255 255" "brightness" "250" +"_light" "255 255 255" +"style" "1" +"targetname" "foobar1" +"origin" "192.000000 128.000000 64.000000" +"classname" "light_dynamic" } // entity 11 { -"classname" "point_message" -"origin" "120.000000 -64.000000 32.000000" "message" "Toggable red slow pulsing dynamic light." +"origin" "120.000000 -64.000000 32.000000" +"classname" "point_message" } // entity 12 { -"classname" "light_dynamic" -"origin" "192.000000 -128.000000 64.000000" -"targetname" "foobar2" -"style" "2" -"_light" "255 0 0" -"start_active" "1" "brightness" "250" +"start_active" "1" +"_light" "255 0 0" +"style" "2" +"targetname" "foobar2" +"origin" "192.000000 -128.000000 64.000000" +"classname" "light_dynamic" } // entity 13 { -"classname" "ncItem" -"spin" "1" -"origin" "160.000000 0.000000 0.000000" -"model" "models/logos/visions.vvm" -"mins" "-16 -16 -64" -"angles" "0 -90 0" -"avelocity" "0 90 0" "shadows" "1" +"avelocity" "0 90 0" +"angles" "0 -90 0" +"mins" "-16 -16 -64" +"model" "models/logos/visions.vvm" +"origin" "160.000000 0.000000 0.000000" +"spin" "1" +"classname" "ncItem" } // entity 14 { -"classname" "env_cubemap" "origin" "0 0 0" +"classname" "env_cubemap" } // entity 15 { -"classname" "env_projectedtexture" -"origin" "-64.000000 -576.000000 24.000000" -"texturename" "textures/skies/smudge/bg" -"lightcolor" "255 255 255 1024" -"parentname" "trainy" -"targetname" "sky_cube" "spawnflags" "1" +"targetname" "sky_cube" +"parentname" "trainy" +"lightcolor" "255 255 255 1024" +"texturename" "textures/skies/smudge/bg" +"origin" "-64.000000 -576.000000 24.000000" +"classname" "env_projectedtexture" } // entity 16 { -"classname" "ncItem" -"spin" "1" -"origin" "192.000000 -576.000000 32.000000" -"mins" "-16 -16 -64" -"model" "models/logos/visions.vvm" -"avelocity" "0 90 0" "shadows" "1" +"avelocity" "0 90 0" +"model" "models/logos/visions.vvm" +"mins" "-16 -16 -64" +"origin" "192.000000 -576.000000 32.000000" +"spin" "1" +"classname" "ncItem" } // entity 17 { -"classname" "point_message" -"origin" "0.000000 -576.000000 24.000000" "message" "env_projectedtexture room" +"origin" "0.000000 -576.000000 24.000000" +"classname" "point_message" } // entity 18 { -"classname" "func_train" -"target" "stop1" -"spawnflags" "8" "targetname" "trainy" +"spawnflags" "8" +"target" "stop1" +"classname" "func_train" // brush 0 { -( -56 -568 8 ) ( -56 -592 8 ) ( -80 -568 8 ) NULL 48 48 0 0.500000 0.500000 0 0 0 -( -48 -560 8 ) ( -72 -560 8 ) ( -48 -560 0 ) NULL 32 16 0 0.500000 0.500000 0 0 0 -( -48 -560 8 ) ( -48 -560 0 ) ( -48 -584 8 ) NULL 0 16 0 0.500000 0.500000 0 0 0 -( -80 -592 0 ) ( -56 -592 0 ) ( -80 -568 0 ) NULL 48 48 0 0.500000 0.500000 0 0 0 -( -80 -592 0 ) ( -80 -592 8 ) ( -56 -592 0 ) NULL 48 16 0 0.500000 0.500000 0 0 0 ( -80 -592 0 ) ( -80 -568 0 ) ( -80 -592 8 ) NULL 16 16 0 0.500000 0.500000 0 0 0 +( -80 -592 0 ) ( -80 -592 8 ) ( -56 -592 0 ) NULL 48 16 0 0.500000 0.500000 0 0 0 +( -80 -592 0 ) ( -56 -592 0 ) ( -80 -568 0 ) NULL 48 48 0 0.500000 0.500000 0 0 0 +( -48 -560 8 ) ( -48 -560 0 ) ( -48 -584 8 ) NULL 0 16 0 0.500000 0.500000 0 0 0 +( -48 -560 8 ) ( -72 -560 8 ) ( -48 -560 0 ) NULL 32 16 0 0.500000 0.500000 0 0 0 +( -56 -568 8 ) ( -56 -592 8 ) ( -80 -568 8 ) NULL 48 48 0 0.500000 0.500000 0 0 0 } // brush 1 { -( -56 -560 16 ) ( -56 -592 16 ) ( -72 -560 16 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 -( -56 -568 16 ) ( -72 -568 16 ) ( -56 -568 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 -( -56 -560 16 ) ( -56 -560 -8 ) ( -56 -592 16 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 -( -72 -592 -8 ) ( -56 -592 -8 ) ( -72 -560 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 -( -72 -584 -8 ) ( -72 -584 16 ) ( -56 -584 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 ( -72 -592 -8 ) ( -72 -560 -8 ) ( -72 -592 16 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 +( -72 -584 -8 ) ( -72 -584 16 ) ( -56 -584 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 +( -72 -592 -8 ) ( -56 -592 -8 ) ( -72 -560 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 +( -56 -560 16 ) ( -56 -560 -8 ) ( -56 -592 16 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 +( -56 -568 16 ) ( -72 -568 16 ) ( -56 -568 -8 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 +( -56 -560 16 ) ( -56 -592 16 ) ( -72 -560 16 ) common/origin 0 0 0 0.500000 0.500000 0 0 0 } } // entity 19 { -"classname" "path_corner" -"origin" "-128.000000 -576.000000 0.000000" -"targetname" "stop1" -"target" "stop2" "speed" "100" +"target" "stop2" +"targetname" "stop1" +"origin" "-128.000000 -576.000000 0.000000" +"classname" "path_corner" } // entity 20 { -"classname" "path_corner" -"origin" "64.000000 -576.000000 0.000000" -"target" "stop1" "targetname" "stop2" +"target" "stop1" +"origin" "64.000000 -576.000000 0.000000" +"classname" "path_corner" } // entity 21 { -"classname" "env_projectedtexture" -"origin" "40.000000 -504.000000 24.000000" -"parentname" "trainy" "spawnflags" "1" +"parentname" "trainy" +"origin" "40.000000 -504.000000 24.000000" +"classname" "env_projectedtexture" } // entity 22 { -"classname" "env_projectedtexture" -"origin" "40.000000 -648.000000 24.000000" -"parentname" "trainy" "spawnflags" "1" +"parentname" "trainy" +"origin" "40.000000 -648.000000 24.000000" +"classname" "env_projectedtexture" } // entity 23 { "classname" "func_button" "OnPressed" "sky_cube,SpotlightTexture,env/sundown_hdr/250th/bg,0,-1" -"OnPressed" "sky_cube,SpotlightTexture,env/dune_hdr/250th/bg,2.5,-1" +"OnPressed" "sky_cube,SpotlightTexture,env/dune,2.5,-1" "OnPressed" "sky_cube,SpotlightTexture,env/smudge/bg,5,-1" "OnPressed" "sky_cube,SetPattern,zqmaamqzzqmaamqz,5,-1" "OnPressed" "sky_cube,SetPattern,z,7.5,-1" // brush 0 { -( -16 -760 8 ) ( -16 -768 8 ) ( -32 -760 8 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 -( -16 -760 64 ) ( -32 -760 64 ) ( -16 -760 -64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 -( -16 -760 64 ) ( -16 -760 -64 ) ( -16 -768 64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 -( -24 -768 -8 ) ( -8 -768 -8 ) ( -24 -760 -8 ) measure/counter 48 0 0 0.500000 0.500000 0 0 0 -( -32 -768 -64 ) ( -32 -768 64 ) ( -16 -768 -64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 ( -32 -768 -64 ) ( -32 -760 -64 ) ( -32 -768 64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 +( -32 -768 -64 ) ( -32 -768 64 ) ( -16 -768 -64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 +( -24 -768 -8 ) ( -8 -768 -8 ) ( -24 -760 -8 ) measure/counter 48 0 0 0.500000 0.500000 0 0 0 +( -16 -760 64 ) ( -16 -760 -64 ) ( -16 -768 64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 +( -16 -760 64 ) ( -32 -760 64 ) ( -16 -760 -64 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 +( -16 -760 8 ) ( -16 -768 8 ) ( -32 -760 8 ) measure/counter 0 0 0 0.500000 0.500000 0 0 0 } } // entity 24 @@ -377,11 +377,11 @@ "classname" "func_dustmotes" // brush 0 { -( -128 0 -40 ) ( -256 0 -40 ) ( -256 -128 -40 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 -( -256 -128 80 ) ( -256 0 80 ) ( -128 0 80 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 -( -256 -128 8 ) ( -128 -128 8 ) ( -128 -128 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 8 ) ( -128 0 8 ) ( -128 0 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 -( -128 0 8 ) ( -256 0 8 ) ( -256 0 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 ( -256 0 8 ) ( -256 -128 8 ) ( -256 -128 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( -128 0 8 ) ( -256 0 8 ) ( -256 0 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 8 ) ( -128 0 8 ) ( -128 0 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( -256 -128 8 ) ( -128 -128 8 ) ( -128 -128 0 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( -256 -128 80 ) ( -256 0 80 ) ( -128 0 80 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( -128 0 -40 ) ( -256 0 -40 ) ( -256 -128 -40 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 } } diff --git a/base/mapsrc/hdr.map b/base/mapsrc/hdr.map index 24c0ef22..0a476986 100644 --- a/base/mapsrc/hdr.map +++ b/base/mapsrc/hdr.map @@ -1,22 +1,13 @@ // entity 0 { -"hdr_iris_fade_down" "1" -"hdr_iris_fade_up" "0.5" -"hdr_iris_multiplier" "1" -"hdr_iris_maxvalue" "4" -"hdr_iris_minvalue" "0.0" "classname" "worldspawn" +"hdr_iris_minvalue" "0.0" +"hdr_iris_maxvalue" "4" +"hdr_iris_multiplier" "1" +"hdr_iris_fade_up" "0.5" +"hdr_iris_fade_down" "1" // brush 0 { -( -1536 -132 0 ) ( -1536 252 0 ) ( -1536 -132 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( -552 -192 0 ) ( -552 -192 8 ) ( -40 -192 0 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( -552 -192 -128 ) ( -40 -192 -128 ) ( -552 192 -128 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( 256 232 8 ) ( 256 232 0 ) ( 256 -152 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( -40 192 8 ) ( -552 192 8 ) ( -40 192 0 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -( -48 192 -64 ) ( -48 -192 -64 ) ( -560 192 -64 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 -} -// brush 1 -{ ( 0 -200 256 ) ( 0 184 256 ) ( 0 -200 264 ) common/skyportal 16 0 0 0.250000 0.250000 0 0 0 ( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 ( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 @@ -24,53 +15,53 @@ ( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 ( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 } +// brush 1 +{ +( -1536 -192 256 ) ( -1536 192 256 ) ( -1536 -192 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -192 256 ) ( -1536 -192 264 ) ( -1024 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1984 -192 -128 ) ( -1472 -192 -128 ) ( -1984 192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1472 192 -184 ) ( -1472 192 -192 ) ( -1472 -192 -184 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -1024 192 264 ) ( -1536 192 264 ) ( -1024 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1032 192 0 ) ( -1032 -192 0 ) ( -1544 192 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +} // brush 2 { -( -1536 -192 256 ) ( -1536 192 256 ) ( -1536 -192 264 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1536 -192 256 ) ( -1536 -192 264 ) ( -1024 -192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1984 -192 -128 ) ( -1472 -192 -128 ) ( -1984 192 -128 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1472 192 -184 ) ( -1472 192 -192 ) ( -1472 -192 -184 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1024 192 264 ) ( -1536 192 264 ) ( -1024 192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1032 192 0 ) ( -1032 -192 0 ) ( -1544 192 0 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 +( 256 -192 64 ) ( 256 192 64 ) ( 256 -192 72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 760 192 0 ) ( 760 -192 0 ) ( 248 192 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 3 { -( 256 -192 64 ) ( 256 192 64 ) ( 256 -192 72 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 760 192 0 ) ( 760 -192 0 ) ( 248 192 0 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -588 256 ) ( -1536 -204 256 ) ( -1536 -588 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -24 -256 256 ) ( -24 -256 264 ) ( 488 -256 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1064 -576 -128 ) ( -552 -576 -128 ) ( -1064 -192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -112 -192 0 ) ( -112 -576 0 ) ( -624 -192 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 4 { -( -1536 -588 256 ) ( -1536 -204 256 ) ( -1536 -588 264 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -24 -256 256 ) ( -24 -256 264 ) ( 488 -256 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1064 -576 -128 ) ( -552 -576 -128 ) ( -1064 -192 -128 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -112 -192 0 ) ( -112 -576 0 ) ( -624 -192 0 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -148 256 ) ( -1536 236 256 ) ( -1536 -148 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -24 192 256 ) ( -24 192 264 ) ( 488 192 256 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -1064 -128 -128 ) ( -552 -128 -128 ) ( -1064 256 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 552 8 ) ( 320 552 0 ) ( 320 168 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -104 256 264 ) ( -616 256 264 ) ( -104 256 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -112 256 0 ) ( -112 -128 0 ) ( -624 256 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 5 { -( -1536 -148 256 ) ( -1536 236 256 ) ( -1536 -148 264 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -24 192 256 ) ( -24 192 264 ) ( 488 192 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -1064 -128 -128 ) ( -552 -128 -128 ) ( -1064 256 -128 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( 320 552 8 ) ( 320 552 0 ) ( 320 168 8 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -104 256 264 ) ( -616 256 264 ) ( -104 256 256 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 -( -112 256 0 ) ( -112 -128 0 ) ( -624 256 0 ) pbrtest/tiles032 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -192 384 ) ( -1536 192 384 ) ( -1536 -192 392 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -192 384 ) ( -1536 -192 392 ) ( -1024 -192 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1984 -192 0 ) ( -1472 -192 0 ) ( -1984 192 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1472 192 -56 ) ( -1472 192 -64 ) ( -1472 -192 -56 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1024 192 392 ) ( -1536 192 392 ) ( -1024 192 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1032 192 128 ) ( -1032 -192 128 ) ( -1544 192 128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 6 { -( -1536 -192 384 ) ( -1536 192 384 ) ( -1536 -192 392 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1536 -192 384 ) ( -1536 -192 392 ) ( -1024 -192 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1984 -192 0 ) ( -1472 -192 0 ) ( -1984 192 0 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1472 192 -56 ) ( -1472 192 -64 ) ( -1472 -192 -56 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1024 192 392 ) ( -1536 192 392 ) ( -1024 192 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1032 192 128 ) ( -1032 -192 128 ) ( -1544 192 128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -} -// brush 7 -{ ( 256 -192 192 ) ( 256 192 192 ) ( 256 -192 200 ) common/skyportal 0 384 0 0.250000 0.250000 0 0 0 ( 256 -192 384 ) ( 256 -192 392 ) ( 768 -192 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( -192 -192 0 ) ( 320 -192 0 ) ( -192 192 0 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 @@ -78,26 +69,26 @@ ( 768 192 392 ) ( 256 192 392 ) ( 768 192 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( 760 192 128 ) ( 760 -192 128 ) ( 248 192 128 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 } +// brush 7 +{ +( -1536 -588 384 ) ( -1536 -204 384 ) ( -1536 -588 392 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -24 -256 384 ) ( -24 -256 392 ) ( 488 -256 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1064 -576 0 ) ( -552 -576 0 ) ( -1064 -192 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 0 120 136 ) ( 0 120 128 ) ( 0 -264 136 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -104 -192 392 ) ( -616 -192 392 ) ( -104 -192 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -112 -192 128 ) ( -112 -576 128 ) ( -624 -192 128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +} // brush 8 { -( -1536 -588 384 ) ( -1536 -204 384 ) ( -1536 -588 392 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -24 -256 384 ) ( -24 -256 392 ) ( 488 -256 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1064 -576 0 ) ( -552 -576 0 ) ( -1064 -192 0 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 0 120 136 ) ( 0 120 128 ) ( 0 -264 136 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -104 -192 392 ) ( -616 -192 392 ) ( -104 -192 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -112 -192 128 ) ( -112 -576 128 ) ( -624 -192 128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -148 384 ) ( -1536 236 384 ) ( -1536 -148 392 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -24 192 384 ) ( -24 192 392 ) ( 488 192 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -1064 -128 0 ) ( -552 -128 0 ) ( -1064 256 0 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 0 536 136 ) ( 0 536 128 ) ( 0 152 136 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -104 256 392 ) ( -616 256 392 ) ( -104 256 384 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -112 256 128 ) ( -112 -128 128 ) ( -624 256 128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 9 { -( -1536 -148 384 ) ( -1536 236 384 ) ( -1536 -148 392 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -24 192 384 ) ( -24 192 392 ) ( 488 192 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -1064 -128 0 ) ( -552 -128 0 ) ( -1064 256 0 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 0 536 136 ) ( 0 536 128 ) ( 0 152 136 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -104 256 392 ) ( -616 256 392 ) ( -104 256 384 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -112 256 128 ) ( -112 -128 128 ) ( -624 256 128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -} -// brush 10 -{ ( 0 -576 384 ) ( 0 -192 384 ) ( 0 -576 392 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( 272 -256 384 ) ( 272 -256 392 ) ( 784 -256 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( -768 -576 0 ) ( -256 -576 0 ) ( -768 -192 0 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 @@ -105,7 +96,7 @@ ( 192 -192 392 ) ( -320 -192 392 ) ( 192 -192 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( 184 -192 128 ) ( 184 -576 128 ) ( -328 -192 128 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 } -// brush 11 +// brush 10 { ( -1472 -200 256 ) ( -1472 184 256 ) ( -1472 -200 264 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 ( -552 -192 256 ) ( -552 -192 264 ) ( -40 -192 256 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 @@ -114,7 +105,7 @@ ( -40 192 264 ) ( -552 192 264 ) ( -40 192 256 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 ( -48 192 192 ) ( -48 -192 192 ) ( -560 192 192 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 } -// brush 12 +// brush 11 { ( 0 -120 384 ) ( 0 264 384 ) ( 0 -120 392 ) common/skyportal 496 256 0 0.250000 0.250000 0 0 0 ( 272 192 384 ) ( 272 192 392 ) ( 784 192 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 @@ -123,7 +114,7 @@ ( 192 256 392 ) ( -320 256 392 ) ( 192 256 384 ) common/skyportal 0 256 0 0.250000 0.250000 0 0 0 ( 184 256 128 ) ( 184 -128 128 ) ( -328 256 128 ) common/skyportal 0 0 0 0.250000 0.250000 0 0 0 } -// brush 13 +// brush 12 { ( 2560 448 512 ) ( 2560 456 512 ) ( 2560 448 768 ) common/skyportal 48 0 0 0.500000 0.500000 0 0 0 ( 2560 448 512 ) ( 2560 448 768 ) ( 2568 448 512 ) common/skyportal 16 0 0 0.500000 0.500000 0 0 0 @@ -132,7 +123,7 @@ ( 2568 456 768 ) ( 2560 456 768 ) ( 2568 456 512 ) common/skyportal 16 0 0 0.500000 0.500000 0 0 0 ( 2568 456 768 ) ( 2568 448 768 ) ( 2560 456 768 ) common/skyportal 16 16 0 0.500000 0.500000 0 0 0 } -// brush 14 +// brush 13 { ( 2048 1024 256 ) ( 2560 1024 256 ) ( 2048 1536 256 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 ( 2048 1024 256 ) ( 2048 1536 0 ) ( 2048 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 @@ -141,7 +132,7 @@ ( 2048 1536 256 ) ( 2560 1536 0 ) ( 2560 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 320 ) ( 2560 1024 320 ) ( 2048 1024 320 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 } -// brush 15 +// brush 14 { ( 2560 1536 256 ) ( 2560 1536 0 ) ( 2048 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1024 256 ) ( 2048 1536 0 ) ( 2048 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 @@ -150,7 +141,7 @@ ( 2048 1600 256 ) ( 2560 1600 0 ) ( 2560 1600 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 256 ) ( 2560 1024 256 ) ( 2048 1024 256 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 } -// brush 16 +// brush 15 { ( 2560 1024 256 ) ( 2560 1024 0 ) ( 2560 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2560 1024 0 ) ( 2048 1024 256 ) ( 2560 1024 256 ) skybox/sundown 32 0 0 0.500000 0.500000 0 0 0 @@ -159,7 +150,7 @@ ( 2048 1536 256 ) ( 2560 1536 0 ) ( 2560 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 256 ) ( 2560 1024 256 ) ( 2048 1024 256 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 } -// brush 17 +// brush 16 { ( 2560 1024 0 ) ( 2048 1024 0 ) ( 2560 1536 0 ) skybox/sundown 24 0 0 0.500000 0.500000 0 0 0 ( 2048 1024 256 ) ( 2048 1536 0 ) ( 2048 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 @@ -168,7 +159,7 @@ ( 2560 1536 256 ) ( 2560 1024 0 ) ( 2560 1024 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 256 ) ( 2560 1536 0 ) ( 2560 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 } -// brush 18 +// brush 17 { ( 2560 1024 256 ) ( 2048 1024 256 ) ( 2560 1024 0 ) skybox/sundown 32 0 0 0.500000 0.500000 0 0 0 ( 2048 1024 256 ) ( 2048 1536 0 ) ( 2048 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 @@ -177,7 +168,7 @@ ( 2560 1536 256 ) ( 2560 1024 0 ) ( 2560 1024 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 256 ) ( 2560 1024 256 ) ( 2048 1024 256 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 } -// brush 19 +// brush 18 { ( 2048 1536 256 ) ( 2048 1536 0 ) ( 2048 1024 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 1984 1024 256 ) ( 1984 1536 0 ) ( 1984 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 @@ -186,7 +177,7 @@ ( 2048 1536 256 ) ( 2560 1536 0 ) ( 2560 1536 256 ) skybox/sundown 0 0 0 0.500000 0.500000 0 0 0 ( 2048 1536 256 ) ( 2560 1024 256 ) ( 2048 1024 256 ) skybox/sundown 384 0 0 0.500000 0.500000 0 0 0 } -// brush 20 +// brush 19 { ( 120 -8 0 ) ( 120 12 0 ) ( 120 -8 4 ) pbrtest/metal022 0 0 0 0.500000 0.500000 0 0 0 ( 120 -8 0 ) ( 120 -8 4 ) ( 140 -8 0 ) pbrtest/metal022 0 0 0 0.500000 0.500000 0 0 0 @@ -195,6 +186,132 @@ ( 140 8 -60 ) ( 120 8 -60 ) ( 140 8 -64 ) pbrtest/metal022 0 0 0 0.500000 0.500000 0 0 0 ( 140 12 4 ) ( 140 -8 4 ) ( 120 12 4 ) pbrtest/metal022 0 0 0 0.500000 0.500000 0 0 0 } +// brush 20 +{ +( 140 76 4 ) ( 140 56 4 ) ( 120 76 4 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 140 72 -60 ) ( 120 72 -60 ) ( 140 72 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 136 76 4 ) ( 136 76 0 ) ( 136 56 4 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 120 56 -64 ) ( 140 56 -64 ) ( 120 76 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 120 56 0 ) ( 120 56 4 ) ( 140 56 0 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 120 56 0 ) ( 120 76 0 ) ( 120 56 4 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 21 +{ +( 120 -72 0 ) ( 120 -52 0 ) ( 120 -72 4 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +( 120 -72 0 ) ( 120 -72 4 ) ( 140 -72 0 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +( 120 -72 -64 ) ( 140 -72 -64 ) ( 120 -52 -64 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +( 136 -52 4 ) ( 136 -52 0 ) ( 136 -72 4 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +( 140 -56 -60 ) ( 120 -56 -60 ) ( 140 -56 -64 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +( 140 -52 4 ) ( 140 -72 4 ) ( 120 -52 4 ) pbrtest/woodsiding001 -136 208 90 0.250000 0.250000 0 0 0 +} +// brush 22 +{ +( 80 96 -72 ) ( 168 96 -72 ) ( 80 -96 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -132 0 ) ( -1536 252 0 ) ( -1536 -132 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( -552 -192 0 ) ( -552 -192 8 ) ( -40 -192 0 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( -552 -192 -128 ) ( -40 -192 -128 ) ( -552 192 -128 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( 256 232 8 ) ( 256 232 0 ) ( 256 -152 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( -40 192 8 ) ( -552 192 8 ) ( -40 192 0 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 23 +{ +( 184 72 -8 ) ( 184 -120 -8 ) ( 184 72 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 96 -120 -8 ) ( 184 -120 -8 ) ( 184 -120 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 168 96 -72 ) ( 80 96 -72 ) ( 80 -96 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 256 232 8 ) ( 256 232 0 ) ( 256 -152 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( -40 192 8 ) ( -552 192 8 ) ( -40 192 0 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( -48 192 -64 ) ( -48 -192 -64 ) ( -560 192 -64 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 24 +{ +( 8 64 -8 ) ( 96 64 -8 ) ( 8 64 -72 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( 0 -184 -8 ) ( 0 8 -8 ) ( 0 8 -72 ) pbrtest/woodfloor041 256 0 0 0.250000 0.250000 0 0 0 +( 168 32 -72 ) ( 80 32 -72 ) ( 80 -160 -72 ) pbrtest/woodfloor041 0 -256 0 0.250000 0.250000 0 0 0 +( -1536 -196 0 ) ( -1536 188 0 ) ( -1536 -196 8 ) pbrtest/woodfloor041 256 0 0 0.250000 0.250000 0 0 0 +( -40 128 8 ) ( -552 128 8 ) ( -40 128 0 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( -48 128 -64 ) ( -48 -256 -64 ) ( -560 128 -64 ) pbrtest/woodfloor041 0 -256 0 0.250000 0.250000 0 0 0 +} +// brush 25 +{ +( 0 -96 -8 ) ( 0 96 -8 ) ( 0 -96 -72 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( 80 -64 -8 ) ( -8 -64 -8 ) ( -8 -64 -72 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( 24 -128 -8 ) ( 112 -128 -8 ) ( 112 -128 -72 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( 168 96 -72 ) ( 80 96 -72 ) ( 80 -96 -72 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -132 0 ) ( -1536 252 0 ) ( -1536 -132 8 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +( -48 192 -64 ) ( -48 -192 -64 ) ( -560 192 -64 ) pbrtest/metalplates006 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 26 +{ +( 168 96 -72 ) ( 80 96 -72 ) ( 80 -96 -72 ) common/caulk 32 0 0 0.250000 0.250000 0 0 0 +( 80 -96 -64 ) ( 80 96 -64 ) ( 168 96 -64 ) liquid/water2 32 0 0 0.250000 0.250000 0 0 0 +( 96 -120 -8 ) ( 184 -120 -8 ) ( 184 -120 -72 ) common/caulk 32 -32 0 0.250000 0.250000 0 0 0 +( 184 -120 -8 ) ( 184 72 -8 ) ( 184 72 -72 ) common/caulk 0 -32 0 0.250000 0.250000 0 0 0 +( 168 120 -8 ) ( 80 120 -8 ) ( 80 120 -72 ) common/caulk 32 -32 0 0.250000 0.250000 0 0 0 +( 72 96 -8 ) ( 72 -96 -8 ) ( 72 -96 -72 ) common/caulk 0 -32 0 0.250000 0.250000 0 0 0 +} +// brush 27 +{ +( 64 192 -64 ) ( 64 -192 -64 ) ( -448 192 -64 ) pbrtest/pavingstones094 -448 0 0 0.250000 0.250000 0 0 0 +( 72 192 8 ) ( -440 192 8 ) ( 72 192 0 ) pbrtest/pavingstones094 -448 0 0 0.250000 0.250000 0 0 0 +( 0 -180 0 ) ( 0 204 0 ) ( 0 -180 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( 280 96 -72 ) ( 192 96 -72 ) ( 192 -96 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 184 -120 -8 ) ( 184 72 -8 ) ( 184 72 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 192 120 -8 ) ( 280 120 -8 ) ( 192 120 -72 ) pbrtest/concrete028 -448 0 0 0.250000 0.250000 0 0 0 +} +// brush 28 +{ +( -48 248 -64 ) ( -48 -136 -64 ) ( -560 248 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -76 0 ) ( -1536 308 0 ) ( -1536 -76 8 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 168 152 -72 ) ( 80 152 -72 ) ( 80 -40 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 24 -64 -8 ) ( 112 -64 -8 ) ( 112 -64 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 80 0 -8 ) ( -8 0 -8 ) ( -8 0 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 0 -40 -8 ) ( 0 152 -8 ) ( 0 -40 -72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 29 +{ +( 0 24 -8 ) ( 0 216 -8 ) ( 0 24 -72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 80 64 -8 ) ( -8 64 -8 ) ( -8 64 -72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 24 0 -8 ) ( 112 0 -8 ) ( 112 0 -72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 168 216 -72 ) ( 80 216 -72 ) ( 80 24 -72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( -1536 -12 0 ) ( -1536 372 0 ) ( -1536 -12 8 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( -48 312 -64 ) ( -48 -72 -64 ) ( -560 312 -64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +} +// brush 30 +{ +( -48 120 -64 ) ( -48 -264 -64 ) ( -560 120 -64 ) pbrtest/pavingstones094 0 -288 0 0.250000 0.250000 0 0 0 +( -1536 -204 0 ) ( -1536 180 0 ) ( -1536 -204 8 ) pbrtest/pavingstones094 288 0 0 0.250000 0.250000 0 0 0 +( 168 24 -72 ) ( 80 24 -72 ) ( 80 -168 -72 ) common/caulk 0 -32 0 0.250000 0.250000 0 0 0 +( 24 -192 -8 ) ( 112 -192 -8 ) ( 112 -192 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 80 -128 -8 ) ( -8 -128 -8 ) ( -8 -128 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 0 -168 -8 ) ( 0 24 -8 ) ( 0 -168 -72 ) pbrtest/concrete028 288 0 0 0.250000 0.250000 0 0 0 +} +// brush 31 +{ +( 136 192 -64 ) ( 136 -192 -64 ) ( -376 192 -64 ) pbrtest/pavingstones094 -224 0 0 0.250000 0.250000 0 0 0 +( 256 248 8 ) ( 256 248 0 ) ( 256 -136 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( 1096 -192 0 ) ( 1096 -192 8 ) ( 1608 -192 0 ) pbrtest/pavingstones094 -224 0 0 0.250000 0.250000 0 0 0 +( 72 -180 0 ) ( 72 204 0 ) ( 72 -180 8 ) pbrtest/pavingstones094 0 0 0 0.250000 0.250000 0 0 0 +( 352 96 -72 ) ( 264 96 -72 ) ( 264 -96 -72 ) common/caulk -32 0 0 0.250000 0.250000 0 0 0 +( 328 -120 -8 ) ( 240 -120 -8 ) ( 328 -120 -72 ) pbrtest/concrete028 -224 0 0 0.250000 0.250000 0 0 0 +} +// brush 32 +{ +( 80 -192 -8 ) ( 168 -192 -8 ) ( 80 -192 -72 ) pbrtest/concrete028 -448 0 0 0.250000 0.250000 0 0 0 +( 72 -432 -8 ) ( 72 -240 -8 ) ( 72 -240 -72 ) common/caulk 32 0 0 0.250000 0.250000 0 0 0 +( 280 24 -72 ) ( 192 24 -72 ) ( 192 -168 -72 ) common/caulk 0 -32 0 0.250000 0.250000 0 0 0 +( 0 -252 0 ) ( 0 132 0 ) ( 0 -252 8 ) pbrtest/pavingstones094 288 0 0 0.250000 0.250000 0 0 0 +( 72 120 8 ) ( -440 120 8 ) ( 72 120 0 ) pbrtest/pavingstones094 -448 0 0 0.250000 0.250000 0 0 0 +( 64 120 -64 ) ( 64 -264 -64 ) ( -448 120 -64 ) pbrtest/pavingstones094 -448 -288 0 0.250000 0.250000 0 0 0 +} +// brush 33 +{ +( 0 152 -8 ) ( 0 344 -8 ) ( 0 152 -72 ) pbrtest/concrete028 -480 0 0 0.250000 0.250000 0 0 0 +( 80 192 -8 ) ( -8 192 -8 ) ( -8 192 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 24 128 -8 ) ( 112 128 -8 ) ( 112 128 -72 ) common/caulk 0 0 0 0.250000 0.250000 0 0 0 +( 168 344 -72 ) ( 80 344 -72 ) ( 80 152 -72 ) common/caulk 0 32 0 0.250000 0.250000 0 0 0 +( -1536 116 0 ) ( -1536 500 0 ) ( -1536 116 8 ) pbrtest/pavingstones094 -480 0 0 0.250000 0.250000 0 0 0 +( -48 440 -64 ) ( -48 56 -64 ) ( -560 440 -64 ) pbrtest/pavingstones094 0 480 0 0.250000 0.250000 0 0 0 +} } // entity 1 { @@ -251,28 +368,7 @@ "classname" "prop_physics" "origin" "-1344 64 0" "model" "models/props_gltf/boombox.gltf" -"modelscale" "25" -"mins" "-12 -12 -12" +"modelscale" "25" +"mins" "-12 -12 -12" "maxs" "12 12 12" } -// entity 10 -{ -"classname" "prop_physics" -"origin" "-1000 64 0" -"model" "models/props_gltf/waterbottle.gltf" -"modelscale" "1" -"mins" "-12 -12 -12" -"maxs" "12 12 12" -} - -// entity 10 -{ -"classname" "ncItem" -"origin" "-1000 0 -32" -"model" "models/props_gltf/glTF/FlightHelmet.gltf" -"modelscale" "1" -"mins" "-12 -12 -12" -"maxs" "12 12 64" -"spin" "1" -} - diff --git a/base/mapsrc/lean.map b/base/mapsrc/lean.map index c88b4f3b..045cefa9 100644 --- a/base/mapsrc/lean.map +++ b/base/mapsrc/lean.map @@ -1,147 +1,147 @@ // entity 0 { -"classname" "worldspawn" "skyname" "smudge" +"classname" "worldspawn" // brush 0 { -( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -72 ) ( 128 -128 -72 ) ( -128 128 -72 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 ( -128 128 -64 ) ( 128 -128 -64 ) ( -128 -128 -64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -72 ) ( 128 -128 -72 ) ( -128 128 -72 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) dev/dev_measurewall01a 0 0 0 0.250000 0.250000 0 0 0 } // brush 1 { -( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 64 64 ) ( -64 64 72 ) ( 64 64 72 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 +( 64 64 64 ) ( -64 64 72 ) ( 64 64 72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 } // brush 2 { -( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 64 72 ) ( -64 64 72 ) ( 64 64 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 -64 72 ) ( 64 64 64 ) ( 64 64 72 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 +( 64 -64 72 ) ( 64 64 64 ) ( 64 64 72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 64 64 72 ) ( -64 64 72 ) ( 64 64 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 } // brush 3 { -( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 64 72 ) ( 64 64 64 ) ( 64 -64 72 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 -64 64 ) ( -64 -64 72 ) ( -64 -64 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 +( 64 -64 64 ) ( -64 -64 72 ) ( -64 -64 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 64 64 72 ) ( 64 64 64 ) ( 64 -64 72 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 } // brush 4 { -( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( 64 64 72 ) ( -64 64 72 ) ( 64 64 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -64 -64 64 ) ( -64 -64 72 ) ( 64 -64 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 -( -64 -64 72 ) ( -64 64 64 ) ( -64 -64 64 ) pbrtest/bricks023 0 0 0 0.250000 0.250000 0 0 0 +( -64 -64 72 ) ( -64 64 64 ) ( -64 -64 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -64 -64 64 ) ( -64 -64 72 ) ( 64 -64 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 64 64 72 ) ( -64 64 72 ) ( 64 64 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 128 64 ) ( 128 -128 64 ) ( 128 128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 +( 128 128 128 ) ( 128 -128 128 ) ( -128 128 128 ) pbrtest/concrete028 0 0 0 0.250000 0.250000 0 0 0 } // brush 5 { -( 64 64 144 ) ( 64 -64 144 ) ( -64 64 144 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 -( 64 64 144 ) ( -64 64 144 ) ( 64 64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 -( 64 64 144 ) ( 64 64 128 ) ( 64 -64 144 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 -( -64 -64 128 ) ( 64 -64 128 ) ( -64 64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 -( -64 -64 128 ) ( -64 -64 144 ) ( 64 -64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 ( -64 -64 128 ) ( -64 64 128 ) ( -64 -64 144 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 +( -64 -64 128 ) ( -64 -64 144 ) ( 64 -64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 +( -64 -64 128 ) ( 64 -64 128 ) ( -64 64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 +( 64 64 144 ) ( 64 64 128 ) ( 64 -64 144 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 +( 64 64 144 ) ( -64 64 144 ) ( 64 64 128 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 +( 64 64 144 ) ( 64 -64 144 ) ( -64 64 144 ) common/skyportal 0 0 0 0.500000 0.500000 0 0 0 } // brush 6 { -( 0 32 32 ) ( 0 -48 32 ) ( -8 32 32 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 -( 0 32 24 ) ( -8 32 24 ) ( 0 32 16 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 -( 8 32 -56 ) ( 8 32 -64 ) ( 8 -48 -56 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 -( -8 -40 -64 ) ( 0 -40 -64 ) ( -8 40 -64 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 -( -8 -32 -64 ) ( -8 -32 -56 ) ( 0 -32 -64 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 ( -8 -40 -64 ) ( -8 40 -64 ) ( -8 -40 -56 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 +( -8 -32 -64 ) ( -8 -32 -56 ) ( 0 -32 -64 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 +( -8 -40 -64 ) ( 0 -40 -64 ) ( -8 40 -64 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 +( 8 32 -56 ) ( 8 32 -64 ) ( 8 -48 -56 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 +( 0 32 24 ) ( -8 32 24 ) ( 0 32 16 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 +( 0 32 32 ) ( 0 -48 32 ) ( -8 32 32 ) dev/dev_measurewall01a 384 264 0 0.250000 0.250000 0 0 0 } // brush 7 { -( 128 128 -64 ) ( -128 128 64 ) ( 128 128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( 128 136 64 ) ( -128 136 64 ) ( 128 136 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 ( 128 128 64 ) ( 128 -128 64 ) ( -128 128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 128 136 64 ) ( -128 136 64 ) ( 128 136 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 128 128 -64 ) ( -128 128 64 ) ( 128 128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 } // brush 8 { -( 128 -128 -64 ) ( -128 -128 64 ) ( -128 -128 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 -( -128 -136 -64 ) ( -128 -136 64 ) ( 128 -136 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 -( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 ( 128 128 64 ) ( 128 -128 64 ) ( -128 128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( 128 128 64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( -128 -136 -64 ) ( -128 -136 64 ) ( 128 -136 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 128 -64 ) ( -128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( 128 -128 -64 ) ( -128 -128 64 ) ( -128 -128 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 } // brush 9 { -( -128 -128 64 ) ( -128 128 -64 ) ( -128 -128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( -136 -128 -64 ) ( -136 128 -64 ) ( -136 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 -( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 ( 128 128 64 ) ( 128 -128 64 ) ( -128 128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( 128 128 64 ) ( -128 128 64 ) ( 128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( 128 -128 -64 ) ( -128 128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -128 -128 -64 ) ( -128 -128 64 ) ( 128 -128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -136 -128 -64 ) ( -136 128 -64 ) ( -136 -128 64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 +( -128 -128 64 ) ( -128 128 -64 ) ( -128 -128 -64 ) dev/dev_measurewall01d 0 256 0 0.250000 0.250000 0 0 0 } // brush 10 { -( 392 128 64 ) ( 392 -128 64 ) ( 136 128 64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 -( 392 128 64 ) ( 136 128 64 ) ( 392 128 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 -( 136 -128 -64 ) ( 392 -128 -64 ) ( 136 128 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 -( 136 0 -64 ) ( 136 0 64 ) ( 392 0 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 -( 128 -128 -64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 ( 136 -128 64 ) ( 136 128 -64 ) ( 136 -128 -64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( 128 -128 -64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01d 0 256 0 -0.250000 0.250000 0 0 0 +( 136 0 -64 ) ( 136 0 64 ) ( 392 0 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 +( 136 -128 -64 ) ( 392 -128 -64 ) ( 136 128 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 +( 392 128 64 ) ( 136 128 64 ) ( 392 128 -64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 +( 392 128 64 ) ( 392 -128 64 ) ( 136 128 64 ) dev/dev_measurewall01d -32 256 0 -0.250000 0.250000 0 0 0 } // brush 11 { -( 136 -128 64 ) ( 136 128 -64 ) ( 136 -128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 -( 128 -128 -64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 -( 136 -128 -64 ) ( 136 -128 64 ) ( 392 -128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 -( 136 -128 -64 ) ( 392 -128 -64 ) ( 136 128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 -( 400 0 64 ) ( 144 0 64 ) ( 400 0 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 ( 392 128 64 ) ( 392 -128 64 ) ( 136 128 64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 +( 400 0 64 ) ( 144 0 64 ) ( 400 0 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 +( 136 -128 -64 ) ( 392 -128 -64 ) ( 136 128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 +( 136 -128 -64 ) ( 136 -128 64 ) ( 392 -128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 +( 128 -128 -64 ) ( 128 128 -64 ) ( 128 -128 64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 +( 136 -128 64 ) ( 136 128 -64 ) ( 136 -128 -64 ) dev/dev_measurewall01a 0 256 0 -0.250000 0.250000 0 0 0 } } // entity 1 { -"classname" "info_player_start" "origin" "-96.000000 0.000000 0.000000" +"classname" "info_player_start" } // entity 2 { -"classname" "light_environment" -"origin" "0.000000 0.000000 96.000000" -"color" "1 1 1" -"intensity" "2000" -"pitch" "-145" -"samples" "16" -"sunspreadangle" "6" -"filterradius" "1" "ambientcolor" "0.7 0.8 1" +"filterradius" "1" +"sunspreadangle" "6" +"samples" "16" +"pitch" "-145" +"intensity" "2000" +"color" "1 1 1" +"origin" "0.000000 0.000000 96.000000" +"classname" "light_environment" } // entity 3 { -"classname" "env_sun" -"origin" "0.000000 0.000000 96.000000" -"pitch" "-44" "angle" "325" +"pitch" "-44" +"origin" "0.000000 0.000000 96.000000" +"classname" "env_sun" } // entity 4 { -"classname" "env_cubemap" "origin" "64 0 -16" +"classname" "env_cubemap" } // entity 5 { -"origin" "-64 0 -16" "classname" "env_cubemap" +"origin" "-64 0 -16" } diff --git a/base/mapsrc/particles.map b/base/mapsrc/particles.map index 0796e48b..d2a37634 100644 --- a/base/mapsrc/particles.map +++ b/base/mapsrc/particles.map @@ -3,57 +3,57 @@ "classname" "worldspawn" // brush 0 { -( -256 -192 0 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 -( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 -( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 -( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 -( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 ( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 0 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/woodfloor041 0 0 0 0.250000 0.250000 0 0 0 } // brush 1 { -( -256 -192 256 ) ( -256 192 256 ) ( -256 -192 264 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 -( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 -( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 -( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 -( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 ( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 +( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 +( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 +( -256 -192 256 ) ( -256 192 256 ) ( -256 -192 264 ) pbrtest/woodsiding001 0 0 0 0.250000 0.250000 0 0 0 } // brush 2 { -( -320 -192 256 ) ( -320 192 256 ) ( -320 -192 264 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -320 -192 256 ) ( -320 192 256 ) ( -320 -192 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 3 { -( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 4 { -( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 272 -256 256 ) ( 272 -256 264 ) ( 784 -256 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 272 -256 256 ) ( 272 -256 264 ) ( 784 -256 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } // brush 5 { -( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 192 256 264 ) ( -320 256 264 ) ( 192 256 256 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 -( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) pbrtest/bricks045 0 0 0 0.250000 0.250000 0 0 0 +( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 192 256 264 ) ( -320 256 264 ) ( 192 256 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 +( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) pbrtest/redbrick003 0 0 0 0.250000 0.250000 0 0 0 } } // entity 1 @@ -66,79 +66,79 @@ } // entity 3 { -"light" "50" -"origin" "192.000000 128.000000 64.000000" "classname" "light" +"origin" "192.000000 128.000000 64.000000" +"light" "50" } // entity 4 { -"light" "50" -"origin" "192.000000 -128.000000 64.000000" "classname" "light" +"origin" "192.000000 -128.000000 64.000000" +"light" "50" } // entity 5 { -"OnPressed" "foobar,Stop,,0,-1" "classname" "func_button" +"OnPressed" "foobar,Stop,,0,-1" // brush 0 { -( 48 -80 64 ) ( 48 -40 64 ) ( 48 -80 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 40 -80 64 ) ( 40 -80 72 ) ( 80 -80 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 48 -80 -64 ) ( 88 -80 -64 ) ( 48 -40 -64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 80 -40 72 ) ( 80 -40 64 ) ( 80 -80 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 88 -48 72 ) ( 48 -48 72 ) ( 88 -48 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 ( 88 -40 0 ) ( 88 -80 0 ) ( 48 -40 0 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 88 -48 72 ) ( 48 -48 72 ) ( 88 -48 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 80 -40 72 ) ( 80 -40 64 ) ( 80 -80 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 48 -80 -64 ) ( 88 -80 -64 ) ( 48 -40 -64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 40 -80 64 ) ( 40 -80 72 ) ( 80 -80 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 48 -80 64 ) ( 48 -40 64 ) ( 48 -80 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 } } // entity 6 { -"OnPressed" "foobar,Start,,0,-1" "classname" "func_button" +"OnPressed" "foobar,Start,,0,-1" // brush 0 { -( 48 112 64 ) ( 48 152 64 ) ( 48 112 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 40 112 64 ) ( 40 112 72 ) ( 80 112 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 48 112 -64 ) ( 88 112 -64 ) ( 48 152 -64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 80 152 72 ) ( 80 152 64 ) ( 80 112 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 -( 88 144 72 ) ( 48 144 72 ) ( 88 144 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 ( 88 152 0 ) ( 88 112 0 ) ( 48 152 0 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 88 144 72 ) ( 48 144 72 ) ( 88 144 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 80 152 72 ) ( 80 152 64 ) ( 80 112 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 48 112 -64 ) ( 88 112 -64 ) ( 48 152 -64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 40 112 64 ) ( 40 112 72 ) ( 80 112 64 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 +( 48 112 64 ) ( 48 152 64 ) ( 48 112 72 ) pbrtest/metal022 0 0 0 0.250000 0.250000 0 0 0 } } // entity 7 { -"light" "25" -"origin" "-192.000000 128.000000 64.000000" "classname" "light" +"origin" "-192.000000 128.000000 64.000000" +"light" "25" } // entity 8 { -"style" "9" -"light" "25" -"origin" "-192.000000 -64.000000 64.000000" "classname" "light" +"origin" "-192.000000 -64.000000 64.000000" +"light" "25" +"style" "9" } // entity 9 { -"message" "Particle Emitter: On" -"origin" "64.000000 128.000000 32.000000" "classname" "point_message" +"origin" "64.000000 128.000000 32.000000" +"message" "Particle Emitter: On" } // entity 10 { -"message" "Particle Emitter: Off" -"origin" "64.000000 -64.000000 32.000000" "classname" "point_message" +"origin" "64.000000 -64.000000 32.000000" +"message" "Particle Emitter: Off" } // entity 11 { -"interval" "0.25" -"effect_name" "test.ball" -"targetname" "foobar" -"origin" "128.000000 32.000000 32.000000" "classname" "info_particle_system" +"origin" "128.000000 32.000000 32.000000" +"targetname" "foobar" +"effect_name" "test.ball" +"interval" "0.25" } // entity 12 { -"origin" "0 0 -8" "classname" "env_cubemap" +"origin" "0 0 -8" } diff --git a/base/scripts/wireframe.shader b/base/scripts/wireframe.shader new file mode 100644 index 00000000..d2303828 --- /dev/null +++ b/base/scripts/wireframe.shader @@ -0,0 +1,10 @@ +wireframe +{ + program wireframe + + { +if r_wireframe == 1 + nodepthtest +endif + } +} diff --git a/base/textures/env/dlights_0_0_0.ktx b/base/textures/env/dlights_0_0_0.ktx index 490c30ca..9289a430 100644 Binary files a/base/textures/env/dlights_0_0_0.ktx and b/base/textures/env/dlights_0_0_0.ktx differ diff --git a/base/textures/env/hdr_-1216_0_0.ktx b/base/textures/env/hdr_-1216_0_0.ktx index 933f95d7..c7f8863b 100644 Binary files a/base/textures/env/hdr_-1216_0_0.ktx and b/base/textures/env/hdr_-1216_0_0.ktx differ diff --git a/base/textures/env/hdr_-640_0_0.ktx b/base/textures/env/hdr_-640_0_0.ktx index 3edd9654..aae567c3 100644 Binary files a/base/textures/env/hdr_-640_0_0.ktx and b/base/textures/env/hdr_-640_0_0.ktx differ diff --git a/base/textures/env/hdr_0_0_0.ktx b/base/textures/env/hdr_0_0_0.ktx index ae48b717..c649a2f4 100644 Binary files a/base/textures/env/hdr_0_0_0.ktx and b/base/textures/env/hdr_0_0_0.ktx differ diff --git a/src/gs-entbase/server/scripted_sequence.qc b/src/gs-entbase/server/scripted_sequence.qc index f5a5b279..c5f74740 100644 --- a/src/gs-entbase/server/scripted_sequence.qc +++ b/src/gs-entbase/server/scripted_sequence.qc @@ -255,12 +255,16 @@ scripted_sequence::RunOnEntity(entity targ) if (!HasSpawnFlags(SSFL_REPEATABLE)) m_iEnabled = FALSE; + if (f.IsPerforming()) { + f.CancelSchedule(); + } + NSAIScript_Log("\tName: %s", targetname); NSAIScript_Log("\tTarget: %s", m_strMonster); NSAIScript_Log("\tStarted: %f", time); /* if we're told an anim, we better have it... or else. */ - if (m_strActionAnim) { + if (STRING_SET(m_strActionAnim)) { f.m_flSequenceEnd = frameforname(f.modelindex, m_strActionAnim); if (f.m_flSequenceEnd == -1) { print(sprintf("^1ERROR: Framegroup %s not found!\n", m_strActionAnim)); @@ -269,7 +273,7 @@ scripted_sequence::RunOnEntity(entity targ) } /* entity to trigger after sequence ends */ - if (target) { + if (STRING_SET(target)) { NSAIScript_Log("\tTrigger when finished: %s", target); f.m_strRouteEnded = target; f.m_ssLast = this; @@ -290,7 +294,7 @@ scripted_sequence::RunOnEntity(entity targ) f.m_iSequenceFlags = spawnflags; f.m_strSequenceKillTarget = m_strKillTarget; - if (m_strKillTarget) { + if (STRING_SET(m_strKillTarget)) { //readcmd(sprintf("watchpoint_ssqc %d.nextthink\n", num_for_edict(f))); NSAIScript_Log("\tKillTarget when finished: %S", m_strKillTarget); } @@ -301,12 +305,12 @@ scripted_sequence::RunOnEntity(entity targ) } else if (m_iMove == SS_WALK) { f.RouteToPosition(GetOrigin()); f.m_flSequenceSpeed = f.GetWalkSpeed(); - NSAIScript_Log("\tType: SS_WALK (%i)", m_iMove); + NSAIScript_Log("\tType: SS_WALK (%i) at %d up/s", m_iMove, f.m_flSequenceSpeed); return; } else if (m_iMove == SS_RUN) { f.RouteToPosition(GetOrigin()); f.m_flSequenceSpeed = f.GetRunSpeed(); - NSAIScript_Log("\tType: SS_RUN (%i)", m_iMove); + NSAIScript_Log("\tType: SS_RUN (%i) at %d up/s", m_iMove, f.m_flSequenceSpeed); return; } else if (m_iMove == SS_INSTANTANEOUS) { f.SetOrigin(GetOrigin()); @@ -316,7 +320,7 @@ scripted_sequence::RunOnEntity(entity targ) } /* all the non-moving targets will do this at least */ - if (m_strActionAnim) { + if (STRING_SET(m_strActionAnim)) { if (m_iMove == SS_NO) { //f.SetAngles(GetAngles()); //f.SetOrigin(GetOrigin()); @@ -342,14 +346,18 @@ scripted_sequence::RunOnEntity(entity targ) f.m_iSequenceState = SEQUENCESTATE_ENDING; - if (HasSpawnFlags(SSFL_LEAVECORPSE)) - f.ScheduleThink(f.FreeStateDead, duration); - else if (HasSpawnFlags(SSFL_NOSCRIPTMOVE) || m_iMove == SS_NO) - f.ScheduleThink(f.FreeState, duration); - else - f.ScheduleThink(f.FreeStateMoved, duration); + if (HasSpawnFlags(SSFL_LEAVECORPSE)) { + f.think = ncMonster::ScriptedSequenceEnded_Dead; + f.nextthink = GetTime() + duration; + } else if (HasSpawnFlags(SSFL_NOSCRIPTMOVE) || m_iMove == SS_NO) { + f.think = ncMonster::ScriptedSequenceEnded; + f.nextthink = GetTime() + duration; + } else { + f.think = ncMonster::ScriptedSequenceEnded_Moved; + f.nextthink = GetTime() + duration; + } - NSAIScript_Log("\tEnding: %f", f.GetNextThinkTime()); + NSAIScript_Log("\tEnding: %f", f.nextthink); /* make sure we're forgetting about enemies and attack states in sequence */ f.m_eEnemy = __NULL__; diff --git a/src/nav/nodes.h b/src/nav/nodes.h index d5ea3a06..9f5787d8 100644 --- a/src/nav/nodes.h +++ b/src/nav/nodes.h @@ -81,8 +81,29 @@ vector Nodes_FindCoverFromEnemyFarNode(ncActor targetEnemy, vector nodePosition) /** Returns the position of a spot that'll provide cover from the specified enemy. +@param traceEntity The entity which will be testing for collisions. @param targetOrigin The spot to hide from. @return Absolute position of a valid cover spot. */ -vector Nodes_FindCoverFromPosition(vector targetOrigin); +vector Nodes_FindCoverFromPosition(entity traceEntity, vector targetOrigin); + + +/** Returns the position of a spot that is accessible within a specified position. + +@param traceEntity The entity which will be testing for collisions. +@param targetOrigin The spot to be near. +@param minRadius The mininum distance / search radius from the targetOrigin. +@param maxRadius The maximum Radius in which we'll look for a free spot. +@return Absolute position of a valid cover spot. */ +vector Nodes_FindEmptySpotNearPosition(entity traceEntity, vector position, float minRadius, float maxRadius); + + +/** Returns the position of a spot that is far away within a specified position. + +@param traceEntity The entity which will be testing for collisions. +@param targetOrigin The spot to be near. +@param minRadius The mininum distance / search radius from the targetOrigin. +@param maxRadius The maximum Radius in which we'll look for a free spot. +@return Absolute position of a valid cover spot. */ +vector Nodes_FindEmptySpotAwayFromPosition(entity traceEntity, vector position, float minRadius, float maxRadius); /** @} */ // end of nav diff --git a/src/nav/nodes.qc b/src/nav/nodes.qc index 1f63b46a..688c9767 100644 --- a/src/nav/nodes.qc +++ b/src/nav/nodes.qc @@ -212,7 +212,7 @@ vector Nodes_FindCoverFromEnemy(ncActor targetEnemy) { float bestDistance = COST_INFINITE; - int bestNodeID = -1; + int bestNodeID = -1i; for (int i = 0; i < g_iNodes; i++) { vector nodePosition = g_pNodes[i].m_vecOrigin; @@ -226,6 +226,10 @@ Nodes_FindCoverFromEnemy(ncActor targetEnemy) } } + if (bestNodeID != -1i) { + return g_vec_null; + } + return (g_pNodes[bestNodeID].m_vecOrigin); } @@ -294,22 +298,124 @@ Nodes_FindCoverFromEnemyFarNode(ncActor targetEnemy, vector targetNode) } vector -Nodes_FindCoverFromPosition(vector targetOrigin) +Nodes_FindCoverFromPosition(entity traceEntity, vector targetOrigin) { - float bestDistance = 0; - int bestNodeID = -1; + float bestDistance = COST_INFINITE; + int bestNodeID = -1i; + +#if 0 + if (g_iNodes <= 0i) { + return Nodes_FindEmptySpotNearPosition(world, targetOrigin, 512.0, 4096.0f); + } +#endif for (int i = 0; i < g_iNodes; i++) { vector nodePosition = g_pNodes[i].m_vecOrigin; - float nodeDistance = distanceSquared(nodePosition, targetOrigin); + float nodeDistance = distanceSquared(nodePosition, traceEntity.origin); - traceline(targetOrigin, nodePosition, MOVE_WORLDONLY, world); + traceline(nodePosition, targetOrigin, MOVE_NORMAL, traceEntity); - if (trace_fraction < 1.0 && nodeDistance > bestDistance) { + if ((trace_ent == world || trace_fraction < 1.0) && nodeDistance < bestDistance) { bestDistance = nodeDistance; bestNodeID = i; } } + if (bestNodeID) { + return (g_vec_null); + } + + NSError("%v", (g_pNodes[bestNodeID].m_vecOrigin)); return (g_pNodes[bestNodeID].m_vecOrigin); } + +vector +Nodes_FindEmptySpotNearPosition(entity traceEntity, vector position, float minRadius, float maxRadius) +{ + float bestYaw = 0.0f; + float bestDist = 0.0f; + vector testAngle = g_vec_null; + vector testPos = g_vec_null; + + for (float yawTest = 0.0f; yawTest < 360.0f; yawTest += 10.0f) { + vector testPos; + float distSquared; + vector testAngle = traceEntity.angles = [0, yawTest, 0]; + testAngle[0] = testAngle[2] = 0.0f; + makevectors(testAngle); + testPos = position + (v_forward * 2048.0f); + tracebox(position, traceEntity.mins, traceEntity.maxs, testPos, MOVE_NORMAL, traceEntity); + distSquared = distance(position, trace_endpos); + + if (distSquared > bestDist) { + bestYaw = yawTest; + bestDist = distSquared; + } + } + + /* cancel early */ + if (bestDist <= minRadius) { + return (g_vec_null); + } + + for (float dist = minRadius; dist < maxRadius; dist += ((maxRadius - minRadius) / 16.0f)) { + vector testAngle = [0, bestYaw, 0]; + testAngle[0] = testAngle[2] = 0.0f; + makevectors(testAngle); + vector testPos = position + (v_forward * dist); + tracebox(testPos, traceEntity.mins, traceEntity.maxs, testPos, MOVE_NORMAL, traceEntity); + + if (!trace_startsolid) { + return (testPos); + } + } + + + return (g_vec_null); +} + +vector +Nodes_FindEmptySpotAwayFromPosition(entity traceEntity, vector position, float minRadius, float maxRadius) +{ + float bestYaw = 0.0f; + float bestDist = 0.0f; + vector testAngle = g_vec_null; + vector testPos = g_vec_null; + + for (float yawTest = 0.0f; yawTest < 360.0f; yawTest += 10.0f) { + vector testPos; + float distSquared; + vector testAngle = traceEntity.angles = [0, yawTest, 0]; + testAngle[0] = testAngle[2] = 0.0f; + makevectors(testAngle); + testPos = position + (v_forward * 2048.0f); + tracebox(position, traceEntity.mins, traceEntity.maxs, testPos, MOVE_NORMAL, traceEntity); + distSquared = distance(position, trace_endpos); + + if (distSquared > bestDist) { + bestYaw = yawTest; + bestDist = distSquared; + } + } + + /* cancel early */ + if (bestDist <= minRadius) { + return (g_vec_null); + } + + for (float dist = maxRadius; dist > minRadius; dist -= ((maxRadius - minRadius) / 16.0f)) { + vector testAngle = [0, bestYaw, 0]; + testAngle[0] = testAngle[2] = 0.0f; + makevectors(testAngle); + vector testPos = position + (v_forward * dist); + tracebox(testPos, traceEntity.mins, traceEntity.maxs, testPos, MOVE_NORMAL, traceEntity); + + if (!trace_startsolid) { + return (testPos); + } + } + + + return (g_vec_null); +} + diff --git a/src/server/NSOutput.qc b/src/server/NSOutput.qc index a7810895..f0970535 100644 --- a/src/server/NSOutput.qc +++ b/src/server/NSOutput.qc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2022 Vera Visions LLC. + * Copyright (c) 2016-2025 Vera Visions LLC. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -17,12 +17,23 @@ void ncOutput::TriggerOutput(void) { - /* plug into all the inputs. */ - for (entity f = world; (f = find(f, ::targetname, m_strTarget));) { - ncEntity trigger = (ncEntity)f; + ncIO ourOwner = (ncIO)owner; + ncIO ourActivator = (ncIO)m_eActivator; - if (trigger.Input != __NULL__) { - trigger.Input(m_eActivator, m_strInput, m_strData); + /* plug into all the inputs. */ + if (m_strTarget == "!self") { + printf("AAAAAAAAAAAAAAAAA SELF!!!\n"); + ourOwner.Input(m_eActivator, m_strInput, m_strData); + } else if (m_strTarget == "!activator") { + ourActivator.Input(m_eActivator, m_strInput, m_strData); + printf("AAAAAAAAAAAAAAAAA ACTIVATOR!!!\n"); + } else { + for (entity f = world; (f = find(f, ::targetname, m_strTarget));) { + ncEntity trigger = (ncEntity)f; + + if (trigger.Input != __NULL__) { + trigger.Input(m_eActivator, m_strInput, m_strData); + } } } diff --git a/src/server/ai_schedule.h b/src/server/ai_schedule.h index 38afb21b..77236caf 100644 --- a/src/server/ai_schedule.h +++ b/src/server/ai_schedule.h @@ -97,19 +97,26 @@ public: nonvirtual void SetTarget(ncEntity target); nonvirtual ncEntity GetTarget(void); nonvirtual void Think(void); + nonvirtual bool ProgressOnMovement(void); + nonvirtual void SetFailSchedule(string); private: - + string m_name; int m_taskCount; int m_onTask; ncActor m_controllingActor; ncDict m_scheduleDecl; ncEntity m_eTarget; + bool m_inProgress; + bool m_bProgressOnMovement; + string m_failSchedule; nonvirtual bool AssignActor(ncActor targetActor); nonvirtual void Advance(void); nonvirtual void AdvanceLater(float timeDelta); nonvirtual void Cancel(void); + nonvirtual void Message(string); + nonvirtual bool InProgress(void); }; /** @} */ // end of npc_schedules diff --git a/src/server/ai_schedule.qc b/src/server/ai_schedule.qc index 4761085c..0e7bcc51 100644 --- a/src/server/ai_schedule.qc +++ b/src/server/ai_schedule.qc @@ -25,56 +25,138 @@ ncSchedule::ncSchedule(void) m_taskCount = 0i; m_controllingActor = __NULL__; m_scheduleDecl = __NULL__; + m_failSchedule = __NULL__; } void ncSchedule::AdvanceLater(float timeDelta) { - EntLog("Advancing schedule in %f seconds.", timeDelta); + m_inProgress = true; + EntLog("Advancing %S in %f seconds.", m_name, timeDelta); ncTimer newTimer = __NULL__; newTimer = newTimer.TemporaryTimer(this, Advance, timeDelta, false); } +bool +ncSchedule::InProgress(void) +{ + return (m_inProgress); +} void ncSchedule::Advance(void) { string taskInput; string taskParms; + bool shouldCancel = false; + + if (wasfreed(this)) { + return; + } + + /* Our actor is dead. Invalidate right away. */ + if (!m_controllingActor) { + shouldCancel = true; + } else { + if (m_controllingActor.IsAlive() == false) { + shouldCancel = true; + } + + if (m_controllingActor.m_activeSchedule != this) { + shouldCancel = true; + } + } + + if (shouldCancel == true) { + ReleaseThink(); + Cancel(); + return; + } m_onTask++; if (m_onTask > m_taskCount) { + ReleaseThink(); Cancel(); return; } string taskString = m_scheduleDecl.GetString(sprintf("task_%i", m_onTask)); - tokenize_console(taskString); - taskInput = argv(0); - taskParms = argv(1); - EntLog("Advancing schedule to Task %i of %i.", m_onTask, m_taskCount); + if (STRING_SET(taskString)) { + tokenize_console(taskString); + taskInput = argv(0); + taskParms = argv(1); + } else { + EntError("Task %i not defined! Cancelling schedule.", m_onTask); + m_onTask = m_taskCount + 1i; + ReleaseThink(); + Cancel(); + return; + } + + m_inProgress = false; + + EntLog("Advancing %S to Task %i of %i.", m_name, m_onTask, m_taskCount); EntLog("Instructing %S to perform %S with parms %S", m_controllingActor.classname, taskInput, taskParms); - m_controllingActor.Input(this, taskInput, taskParms); + m_controllingActor.Input(this, taskInput, substring(taskString, strlen(taskInput) + 1, -1)); + + /* did we get scheduled for later? no? advance us ourselves */ + if (m_inProgress == false && m_bProgressOnMovement == false) { + AdvanceLater(0.1); + } } void ncSchedule::Cancel(void) { + if (wasfreed(this)) { + return; + } + EntLog("Schedule for %S (%d) terminated.", m_controllingActor.classname, num_for_edict(m_controllingActor)); /* TODO: Let NPC know that it's done? */ - m_controllingActor.m_activeSchedule = __NULL__; - m_controllingActor = __NULL__; + if (m_controllingActor) { + if (m_controllingActor.m_activeSchedule == this) { + m_controllingActor.m_activeSchedule = __NULL__; + + if ((m_onTask <= m_taskCount) && STRING_SET(m_failSchedule)) { + m_controllingActor.Input(this, "PerformSchedule", m_failSchedule); + } + + m_controllingActor = __NULL__; + } + } + Destroy(); } +bool +ncSchedule::ProgressOnMovement(void) +{ + return (m_bProgressOnMovement); +} + void ncSchedule::Think(void) { + bool shouldCancel = false; + /* Our actor is dead. Invalidate right away. */ - if (m_controllingActor.IsAlive() == false) { + if (!m_controllingActor) { + shouldCancel = true; + } else { + if (m_controllingActor.IsAlive() == false) { + shouldCancel = true; + } + + if (m_controllingActor.m_activeSchedule != this) { + shouldCancel = true; + } + } + + if (shouldCancel == true) { ReleaseThink(); Cancel(); return; @@ -84,6 +166,36 @@ ncSchedule::Think(void) ScheduleThink(Think, 0.0f); } +void +ncSchedule::Message(string messageString) +{ + bool lookUpValue = m_scheduleDecl.GetBool(sprintf("fail_on%s", messageString)); + string lookUpString = m_scheduleDecl.GetString(messageString); + EntLog("^2%S received %S", m_name, messageString); + + if (STRING_SET(lookUpString)) { + string taskInput; + string taskParameter; + tokenize_console(lookUpString); + taskInput = argv(0); + taskParameter = substring(lookUpString, strlen(taskInput) + 1, -1); + EntLog("^3triggering Input %S with parameter %S", taskInput, taskParameter); + m_controllingActor.Input(this, taskInput, taskParameter); + } + + if (lookUpValue) { + EntLog("^1schedule killed by message.", taskInput, taskParameter); + ReleaseThink(); + Cancel(); + } +} + +void +ncSchedule::SetFailSchedule(string failSchedule) +{ + m_failSchedule = failSchedule; +} + bool ncSchedule::AssignActor(ncActor targetActor) { @@ -94,9 +206,7 @@ ncSchedule::AssignActor(ncActor targetActor) return (false); } - EntLog("Schedule %d created and active.", num_for_edict(this)); - EntLog("Controlling %S (%d)", m_controllingActor.classname, num_for_edict(m_controllingActor)); - EntLog("Total tasks: %i", m_taskCount); + EntLog("Schedule %S (%d) created and active.\n\t\tControlling %S (%d)\n\t\tTotal tasks: %i", m_name, num_for_edict(this), m_controllingActor.classname, num_for_edict(m_controllingActor), m_taskCount); Advance(); @@ -123,6 +233,7 @@ ncSchedule::CreateSchedule(ncActor targetActor, string scheduleDecl) { ncSchedule newSchedule = spawn(ncSchedule); + newSchedule.m_name = scheduleDecl; newSchedule.m_scheduleDecl = ncDict::LoadDeclFromFile(scheduleDecl, sprintf("schedules/%s.decl", scheduleDecl)); if ((newSchedule.m_scheduleDecl.TokenCount() % 2) != 0) { diff --git a/src/server/entry.qc b/src/server/entry.qc index 4da5d599..2372bb8c 100644 --- a/src/server/entry.qc +++ b/src/server/entry.qc @@ -681,7 +681,7 @@ CheckSpawn(void() spawnfunc) ncEntity ent = (ncEntity)self; string desiredClass = ent.classname; static string lastClass; - bool skipLoad = false; + bool skipLoad = false; /* entity data will be loaded elsewhere */ /* cancel out early */ if (ent == world) { @@ -695,6 +695,16 @@ CheckSpawn(void() spawnfunc) /* no longer needed, immediately discard. */ __fullspawndata = ""; + /* we have to diverge here in order to support in-code class entities, + decl entities and overrides of both. + + this switch also controls the priority: + + 1. maptweaks, can override anything. + 2. entitydef, can even override built-in class names + 2.0 entitydef, defined in a map (maps/foobar.def) + 2.1 entitydef, defined within decls/def/*.def + 3. in-code classes */ if (MapTweak_EntitySpawn(ent) == true) { skipLoad = true; } else if (EntityDef_SpawnClassname(desiredClass) != __NULL__) { diff --git a/src/server/scripts.qc b/src/server/scripts.qc index ba58b4ab..6246ab59 100644 --- a/src/server/scripts.qc +++ b/src/server/scripts.qc @@ -46,18 +46,26 @@ MapC_Init(void) } } -/* Rule specific Scripting, nicknamed 'RuleC' because MapC exists. */ -void -RuleC_Init(void) +__weak string +Game_DefaultRules(void) { string gameType = cvars.GetString("g_gametype"); - string pathToProgs; if (!STRING_SET(gameType)) { bool isCoop = cvars.GetBool("coop"); bool isSingle = (cvars.GetInteger("sv_playerslots") <= 1) ? (true) : (false); - g_ruleCName = gameType = (isSingle || isCoop) == (true) ? "singleplayer" : "deathmatch"; + gameType = (isSingle || isCoop) == (true) ? "singleplayer" : "deathmatch"; } + + return (gameType); +} + +/* Rule specific Scripting, nicknamed 'RuleC' because MapC exists. */ +void +RuleC_Init(void) +{ + string gameType = g_ruleCName = Game_DefaultRules(); + string pathToProgs; pathToProgs = strcat("progs/", gameType, ".dat"); @@ -78,7 +86,7 @@ RuleC_Init(void) externset(g_ruleCProgs, world, "self"); thread(mainFunction()) } else { - NSError("%S does not have a main function.", pathToProgs); + error(sprintf("RuleC %S does not have a main function.", pathToProgs)); } } } diff --git a/src/server/spawn.qc b/src/server/spawn.qc index d6790e0b..62bebd33 100644 --- a/src/server/spawn.qc +++ b/src/server/spawn.qc @@ -173,6 +173,15 @@ Spawn_TeleportToSpawn(entity targetEnt) entity spawnPoint = Spawn_SelectRandom(desiredSpawn); + if (spawnPoint) { + targetEnt.origin = spawnPoint.origin; + targetEnt.angles = spawnPoint.angles; + setorigin_safe(targetEnt, targetEnt.origin); + return; + } + + spawnPoint = Spawn_SelectRandom("info_player_start"); + if (spawnPoint) { targetEnt.origin = spawnPoint.origin; targetEnt.angles = spawnPoint.angles; diff --git a/src/shared/NSEntity.h b/src/shared/NSEntity.h index 085d9ff3..1561aa8a 100644 --- a/src/shared/NSEntity.h +++ b/src/shared/NSEntity.h @@ -75,6 +75,7 @@ public: /* overrides */ virtual void SpawnKey(string,string); virtual void Spawned(void); + virtual void Precache(void); nonvirtual void Spawn(void); /** Tells the engine to make the entity static, effectively making it inaccessible. diff --git a/src/shared/NSEntity.qc b/src/shared/NSEntity.qc index 9c96fc77..659403ed 100644 --- a/src/shared/NSEntity.qc +++ b/src/shared/NSEntity.qc @@ -43,23 +43,34 @@ ncEntity::Spawn(void) return; } + /* only precache at start time... */ + if (time == 0.0f) { + Precache(); + } + Respawn(); } +void +ncEntity::Precache(void) +{ + if (STRING_SET(model)) { + precache_model(model); + } + +#ifdef SERVER + if (STRING_SET(m_strOnTrigger)) { + m_strOnTrigger = CreateOutput(m_strOnTrigger); + } +#endif +} + void ncEntity::Spawned(void) { super::Spawned(); #ifdef SERVER - if (model) { - precache_model(model); - } - - if (m_strOnTrigger != "") { - m_strOnTrigger = CreateOutput(m_strOnTrigger); - } - /* used to network our shared ID */ entityDefID = EntityDef_NetIDFromName(classname); #endif diff --git a/src/shared/NSIO.h b/src/shared/NSIO.h index ad5e25e7..a0a83d7f 100644 --- a/src/shared/NSIO.h +++ b/src/shared/NSIO.h @@ -276,6 +276,10 @@ private: #endif }; +#define CREATE_OUTPUT(x) if (STRING_SET(x)) { \ + x = CreateOutput(x); \ + } + .bool isActor; .bool _mapspawned; diff --git a/src/shared/NSIO.qc b/src/shared/NSIO.qc index da82c9bb..8b1e63ae 100644 --- a/src/shared/NSIO.qc +++ b/src/shared/NSIO.qc @@ -52,13 +52,13 @@ void ncIO::Spawned(void) { #ifdef SERVER - if (m_strOnUser1) + if (STRING_SET(m_strOnUser1)) m_strOnUser1 = CreateOutput(m_strOnUser1); - if (m_strOnUser2) + if (STRING_SET(m_strOnUser2)) m_strOnUser2 = CreateOutput(m_strOnUser2); - if (m_strOnUser3) + if (STRING_SET(m_strOnUser3)) m_strOnUser3 = CreateOutput(m_strOnUser3); - if (m_strOnUser4) + if (STRING_SET(m_strOnUser4)) m_strOnUser4 = CreateOutput(m_strOnUser4); #endif @@ -74,7 +74,14 @@ ncIO::OnRemoveEntity(void) void ncIO::Destroy(void) { - OnRemoveEntity(); + if (wasfreed(this)) { + return; + } + + if (OnRemoveEntity) { + OnRemoveEntity(); + } + customphysics = __NULL__; modelindex = 0; solid = 0; @@ -271,18 +278,22 @@ ncIO::GetSpawnEntity(string keyName, entity startEntity) void ncIO::UseOutput(entity act, string outname) { - if (!outname || outname == "") - return; - - if (!act) + if (!STRING_SET(outname)) { return; + } for (entity f = world; (f = find(f, ::targetname, outname));) { ncOutput op = (ncOutput)f; + NSError("Target: %s", op.m_strTarget); + NSError("Input: %s", op.m_strInput); + NSError("Data Message: %s", op.m_strData); + NSError("Delay: %f", op.m_flDelay); + NSError("Uses: %i", op.m_iCount); + /* no more tries and not -1 (infinite) */ if (op.m_iCount == 0) { - return; + continue; } op.ScheduleOutput(act); @@ -292,37 +303,47 @@ ncIO::UseOutput(entity act, string outname) string ncIO::CreateOutput(string outmsg) { - static int outcount = 0; string outname = ""; - float c; + static int outID = 0i; - if not (outmsg) { + if (!STRING_SET(outmsg)) { error("Cannot assign EMPTY contents to CreateOutput!"); } - outname = sprintf("output_%i", outcount); - outcount++; + /* vanilla trigger and/or reuse */ + if (tokenizebyseparator(outmsg, ",") <= 5) { + return outmsg; + } + + outname = sprintf("output_%i", outID); + outID += 1i; /* to make sure tokenize 'remembers' to tell us about the commonly empty data string, we prepared the output string beforehand to at least contain a _ symbol after the comma separator... now we gotta clip that away using substring(). messy, but that's the only way to keep them at 5 argv() calls per output */ - c = tokenizebyseparator(outmsg, ","); - for (float i = 1; i < c; i+=5) { + for (float i = 1; i < tokenizebyseparator(outmsg, ","); i+=5) { + string ourTarget = substring(argv(i), 1,-1); + string ourInput = substring(argv(i+1), 1,-1); + string ourData = substring(argv(i+2), 1,-1); + float ourDelay = stof(substring(argv(i+3), 1,-1)); + int ourCount = (int)stoi(substring(argv(i+4), 1,-1)); ncOutput new_minion = spawn(ncOutput); + new_minion.owner = this; new_minion.classname = "triggerminion"; new_minion.targetname = outname; - new_minion.m_strTarget = substring(argv(i), 1,-1); - new_minion.m_strInput = substring(argv(i+1), 1,-1); - new_minion.m_strData = substring(argv(i+2), 1,-1); - new_minion.m_flDelay = stof(substring(argv(i+3), 1,-1)); - new_minion.m_iCount = stoi(substring(argv(i+4), 1,-1)); - new_minion.m_iOldCount = new_minion.m_iCount; + new_minion.m_strTarget = ourTarget; + new_minion.m_strInput = ourInput; + new_minion.m_strData = ourData; + new_minion.m_flDelay = ourDelay; + new_minion.m_iOldCount = new_minion.m_iCount = ourCount; /* print final debug output */ NSLog("^2%s::CreateOutput report:", classname); + NSLog("%d Name: %s", num_for_edict(new_minion), outname); + NSLog("Owner: %s (%d)", new_minion.owner.classname, num_for_edict(new_minion.owner)); NSLog("Target: %s", new_minion.m_strTarget); NSLog("Input: %s", new_minion.m_strInput); NSLog("Data Message: %s", new_minion.m_strData); diff --git a/src/shared/NSMonster.h b/src/shared/NSMonster.h index 9ab85921..ffcd353a 100644 --- a/src/shared/NSMonster.h +++ b/src/shared/NSMonster.h @@ -248,6 +248,7 @@ public: #ifdef SERVER /* overrides */ + virtual void DebugDraw(void); virtual void Save(float); virtual void Restore(string,string); virtual void EvaluateEntity(void); @@ -330,14 +331,16 @@ public: nonvirtual bool IsValidEnemy(entity); /** Returns TRUE if the monster is currently on route to a position. */ virtual bool IsOnRoute(void); + /** Override */ + virtual void RouteClear(void); /* sequences */ /** Internal use only. Called when a sequence is done. */ - virtual void FreeState(void); + virtual void ScriptedSequenceEnded(void); /** Internal use only. Called when a sequence is done. */ - virtual void FreeStateMoved(void); + virtual void ScriptedSequenceEnded_Moved(void); /** Internal use only. Called when a sequence is done and we leave a corpse. */ - virtual void FreeStateDead(void); + virtual void ScriptedSequenceEnded_Dead(void); /** Internal use only. Called when a movement route is done. */ virtual void RouteEnded(void); /** Internal use only. Called every frame to progress through a route. */ @@ -354,7 +357,7 @@ public: /** Returns the type of sequence they're currently in. */ nonvirtual int GetSequenceState(void); /** Returns if they're currently in a scripted sequence. */ - nonvirtual bool InSequence(void); + nonvirtual bool InScriptedSequence(void); /* animation cycles */ /** DEPRECATED, Overridable: Called when we need to play a fresh idle framegroup. */ @@ -365,11 +368,12 @@ public: virtual int AnimRun(void); /** Call to play a single animation onto it, which cannot be interrupted by movement. */ virtual void AnimPlay(float); - /** Internal use only. Run every frame to update animation parameters. */ + /** Internal use only. Run every frame to update movement animation parameters. */ virtual void AnimationUpdate(void); /** Returns if we're currently in a forced animation sequence. */ - nonvirtual bool InAnimation(void); - nonvirtual void AnimReset(void); + nonvirtual bool InForcedAnimation(void); + /** Starts the animation sequence from the beginning */ + nonvirtual void AnimationRewind(void); /* states */ /** Called whenever the state of this ncMonster changes. */ @@ -420,6 +424,21 @@ private: vector base_maxs; float base_health; + /* I/O */ + string m_outputOnDamaged; + string m_outputOnDeath; + string m_outputOnHalfHealth; + string m_outputOnHearPlayer; + string m_outputOnFoundEnemy; + string m_outputOnLostEnemy; + string m_outputOnLostEnemyLOS; + string m_outputOnFoundPlayer; + string m_outputOnLostPlayer; + string m_outputOnLostPlayerLOS; + string m_outputOnDamagedByPlayer; + string m_outputOnGreetPlayer; + bool m_bMetPlayer; + /* sequences */ string m_strRouteEnded; int m_iSequenceRemove; @@ -534,10 +553,10 @@ private: bool m_usesNav; bool m_fireFromHead; bool m_pvsSleep; + bool m_bCanAttack; - nonvirtual void _LerpTurnToEnemy(void); nonvirtual void _LerpTurnToPos(vector); - nonvirtual void _LerpTurnToYaw(vector); + nonvirtual void _LerpTurnToYaw(float); virtual void _Alerted(void); nonvirtual void _ChaseAfterSpawn(void); #endif diff --git a/src/shared/NSMonster.qc b/src/shared/NSMonster.qc index 7d37ea04..4903071c 100644 --- a/src/shared/NSMonster.qc +++ b/src/shared/NSMonster.qc @@ -92,6 +92,37 @@ ncMonster::ncMonster(void) m_bGagged = false; m_flSkin = 0; m_flyOffset = 0.0f; + + m_outputOnDamaged = + m_outputOnDeath = + m_outputOnHalfHealth = + m_outputOnHearPlayer = + m_outputOnGreetPlayer = + m_outputOnFoundEnemy = + m_outputOnLostEnemy = + m_outputOnLostEnemyLOS = + m_outputOnFoundPlayer = + m_outputOnLostPlayer = + m_outputOnLostPlayerLOS = + m_outputOnDamagedByPlayer = __NULL__; +#endif +} + +void +ncMonster::DebugDraw(void) +{ +#ifdef SERVER + + super::DebugDraw(); +#if 0 + if not (autocvar(sv_printStateFromNPC, 0) == num_for_edict(this)) { + return; + } + + string aiString = sprintf("State: %S\nSchedule: %S\n", m_mindset, m_activeSchedule.classname); + + print(aiString); +#endif #endif } @@ -472,17 +503,17 @@ void ncMonster::AnimPlay(float seq) { SetFrame(seq); - m_flAnimTime = time + frameduration(modelindex, seq); + m_flAnimTime = GetTime() + frameduration(modelindex, seq); } void -ncMonster::AnimReset(void) +ncMonster::AnimationRewind(void) { frame1time = 0.0f; } bool -ncMonster::InAnimation(void) +ncMonster::InForcedAnimation(void) { return (m_flAnimTime > time) ? true : false; } @@ -496,12 +527,15 @@ ncMonster::Sound(string msg) void ncMonster::Gib(int damage, vector dir) { + string breakModel = GetPropData(PROPINFO_BREAKMODEL); vector vecDir = vectorToAngles(GetOrigin() - dir); SetState(MONSTER_DEAD); MakeInvulnerable(); - string breakModel = GetPropData(PROPINFO_BREAKMODEL); - BreakModel_Spawn(absmin, absmax, dir, damage * 2.5f, vlen(size) / 10, breakModel); + if (STRING_SET(breakModel)) { + BreakModel_Spawn(absmin, absmax, dir, damage * 2.5f, vlen(size) / 10, breakModel); + } + Disappear(); } @@ -601,6 +635,38 @@ ncMonster::AlertNearby(void) } } +void +ncMonster::AlertNearbyToSchedule(string scheduleType) +{ + + /* iterate over all living things. */ + for (entity w = world; (w = nextent(w));) { + if (w.takedamage == DAMAGE_NO) + continue; + + if (w.classname != classname) + continue; + + if (!IsFriend(w.m_iAlliance)) + continue; + + /* only bother if within 512 unit radius */ + if (vlen(origin - w.origin) > 512) + continue; + + //ncMonsterLog("Alert! %s get %s", w.classname, m_eEnemy.classname); + ncMonster f = (ncMonster)w; + + /* we shouldn't override this when they already got a target */ + if (f.m_eEnemy != __NULL__) + continue; + + f.m_eEnemy = m_eEnemy; + f._Alerted(); + f.m_mindset = scheduleType; + } +} + /* returns TRUE if 'enemy' should be considered a valid target for killing */ bool ncMonster::IsValidEnemy(entity enny) @@ -683,6 +749,7 @@ ncMonster::SeenFriend(ncActor theActor) void ncMonster::SeeThink(void) { + /* Prisoners are not meant to react to things they're seeing. */ if (HasSpawnFlags(MSF_PRISONER) == true) { return; } @@ -721,7 +788,11 @@ ncMonster::SeeThink(void) if (m_eEnemy) { /* check if we should invalidate current enemy */ - if (IsValidEnemy(m_eEnemy)) { + if (m_eEnemy.health <= 0) { + m_mindset = ""; + MessageSchedule("DeadEnemy"); + m_eEnemy = __NULL__; + } else if (IsValidEnemy(m_eEnemy)) { /* only update 1/4th of a second */ if (m_flSeeTime > time) return; @@ -735,8 +806,17 @@ ncMonster::SeeThink(void) } /* if we haven't gotten a trace in 5 seconds, give up. */ - if ((m_flTrackingTime + 5.0) > time) + if ((m_flTrackingTime + 5.0) > time) { + m_mindset = ""; + if (isPlayer(m_eEnemy)) { + UseOutput(m_eEnemy, m_outputOnLostPlayerLOS); + } else { + UseOutput(m_eEnemy, m_outputOnLostEnemyLOS); + } + + MessageSchedule("OccludedEnemy"); m_eEnemy = __NULL__; + } } else { /* enemy is not valid anymore, reset it, clear route and search for new enemy */ RouteClear(); @@ -744,10 +824,17 @@ ncMonster::SeeThink(void) RouteToPosition(m_eEnemy.origin + (anglesToForward(angles) * -64)); m_flSequenceSpeed = GetWalkSpeed(); + if (isPlayer(m_eEnemy)) { + UseOutput(m_eEnemy, m_outputOnLostPlayer); + } else { + UseOutput(m_eEnemy, m_outputOnLostEnemy); + } + SetState(MONSTER_ALERT); m_eEnemy = __NULL__; m_eLookAt = __NULL__; m_flSeeTime = 0; + MessageSchedule("LostEnemy"); } } @@ -770,12 +857,26 @@ ncMonster::SeeThink(void) if (m_eEnemy != w) { SeenEnemy((ncActor)w); m_eEnemy = m_eLookAt = w; + MessageSchedule("NewEnemy"); m_flTrackingTime = time; _Alerted(); AlertNearby(); + + if (isPlayer(w)) { + UseOutput(m_eEnemy, m_outputOnFoundPlayer); + } else { + UseOutput(m_eEnemy, m_outputOnFoundEnemy); + } } } else if (isPlayer(w)) { SeenPlayer((ncActor)w); + + if (m_bMetPlayer == false) { + MessageSchedule("SeenPlayer"); + UseOutput(w, m_outputOnGreetPlayer); + } + + m_bMetPlayer = true; } else if (IsFriend(w.m_iAlliance)) { SeenFriend((ncActor)w); } @@ -801,6 +902,12 @@ ncMonster::GetRunSpeed(void) return m_flRunSpeed; } +bool +ncMonster::ShouldTurn(void) +{ + return (ideal_yaw != angles[1]) ? (true) : (false); +} + float ncMonster::GetYawSpeed(void) { @@ -811,10 +918,10 @@ ncMonster::GetYawSpeed(void) } void -ncMonster::_LerpTurnToYaw(vector turnYaw) +ncMonster::_LerpTurnToYaw(float turnYaw) { -#if 1 - input_angles[1] = v_angle[1] = angles[1] = turnYaw[1]; +#if 0 + input_angles[1] = v_angle[1] = angles[1] = turnYaw; #else vector oldAngle = angles; vector angleDelta; @@ -822,11 +929,11 @@ ncMonster::_LerpTurnToYaw(vector turnYaw) float yawDiff = 0.0f; if (IsThinking()) { - input_angles[1] = v_angle[1] = angles[1] = turnYaw[1]; + input_angles[1] = v_angle[1] = angles[1] = turnYaw; } yaw_speed = GetYawSpeed() * (frametime * 5); - ideal_yaw = turnYaw[1]; + ideal_yaw = turnYaw; changeyaw(); angleDelta = angleDifference(oldAngle, angles); @@ -837,7 +944,7 @@ ncMonster::_LerpTurnToYaw(vector turnYaw) if (fabs(angleDelta[1]) > 1.0f) { /* wasn't turning before */ if (m_bTurning == false) { - AnimReset(); + AnimationRewind(); if (yawDiff < 0) { AnimPlay(GetDefAct("turnRight")); @@ -847,6 +954,9 @@ ncMonster::_LerpTurnToYaw(vector turnYaw) } m_bTurning = true; + input_movevalues = g_vec_null; + } else { + m_bTurning = false; } #endif } @@ -855,37 +965,13 @@ void ncMonster::_LerpTurnToPos(vector turnPos) { vector vecWishAngle = vectorToAngles(turnPos - origin); - _LerpTurnToYaw(vecWishAngle); -} - - -void -ncMonster::_LerpTurnToEnemy(void) -{ - vector enemyEyePos; - vector dirAim; - - if (!m_eEnemy) - return; - - /* only continue if we're in one of the three states. */ - if (GetState() != MONSTER_AIMING) - if (GetState() != MONSTER_CHASING) - if (GetState() != MONSTER_FOLLOWING) - return; - - _LerpTurnToPos(m_eEnemy.origin); - - enemyEyePos = (m_eEnemy.origin + m_eEnemy.view_ofs); - - dirAim = vectorToAngles(enemyEyePos - GetEyePos()); - v_angle = dirAim; + _LerpTurnToYaw(vecWishAngle[1]); } void ncMonster::AttackThink(void) { - if (InSequence()) { + if (InScriptedSequence()) { return; } @@ -903,21 +989,13 @@ ncMonster::AttackThink(void) /* something is blocking us */ if (trace_fraction < 1.0f) { - SetState(MONSTER_ALERT); - - /* FIXME: This is unreliable, but unlikely that a player ever is here */ - if (m_vecLKPos != [0,0,0]) { - RouteClear(); - RouteToPosition(m_vecLKPos); - m_flSequenceSpeed = 140; - m_vecLKPos = [0,0,0]; - } + m_bCanAttack = false; } else { - SetState(MONSTER_AIMING); - + m_bCanAttack = true; /* make sure we remember the last known position. */ m_vecLKPos = m_eEnemy.origin; - angles = vectorToAngles(m_vecLKPos - origin); + vector wishAngles = vectorToAngles(m_vecLKPos - origin); + ideal_yaw = wishAngles[1]; } /* the state may have switched */ @@ -925,19 +1003,15 @@ ncMonster::AttackThink(void) return; } - if (GetState() == MONSTER_AIMING) { - int m; - - if (MeleeCondition() == TRUE) - m = AttackMelee(); - else { - m = AttackRanged(); - - /* if we don't have the desired attack mode, walk */ - if (m == FALSE) - SetState(MONSTER_CHASING); + if (m_bCanAttack == true) { + if (MeleeCondition() == TRUE) { + MessageSchedule("CanMeleeAttack1"); + } else { + MessageSchedule("CanRangedAttack1"); } } + + m_flAttackThink = time + 0.25f; } int @@ -947,7 +1021,7 @@ ncMonster::AttackMelee(void) float actMelee1 = GetDefAct("meleeAttack1"); float actMelee2 = GetDefAct("meleeAttack2"); - if (!m_defMelee) + if (STRING_SET(m_defMelee)) return (false); _m_flMeleeDelay = GetSubDefFloat(m_defMelee, "delay"); @@ -987,7 +1061,7 @@ ncMonster::AttackMelee(void) ScheduleThink(AttackMelee_AttackFlail, _m_flMeleeDelay + meleeWait); } - AnimReset(); + AnimationRewind(); if (random() < 0.5 || actMelee2 == -1) AnimPlay(actMelee1); @@ -1114,7 +1188,7 @@ ncMonster::AttackRanged(void) return 1; } - AnimReset(); + AnimationRewind(); AnimPlay(actRanged); /* if we have no spawnclass, it must be a hitscan weapon */ @@ -1147,13 +1221,13 @@ ncMonster::AttackRanged(void) return 1; } else if (throwAnyway == false && inRanged2Range && trace_ent == m_eEnemy) { float actRangedSpecial = GetDefAct("rangeAttack2"); - AnimReset(); + AnimationRewind(); AnimPlay(actRangedSpecial); ScheduleThink(AttackRanged_RangedSpecial, 0.0f); m_flAttackThink = time + frameduration(modelindex, actRangedSpecial); return 1; } else if (inSpecial1Range) { - AnimReset(); + AnimationRewind(); AnimPlay(GetDefAct("specialAttack1")); ScheduleThink(AttackRanged_Throw, m_flProjectileDelay); @@ -1164,7 +1238,7 @@ ncMonster::AttackRanged(void) return 1; } else if (inSpecial2Range) { - AnimReset(); + AnimationRewind(); AnimPlay(GetDefAct("specialAttack2")); ScheduleThink(AttackRanged_Throw, m_flProjectileDelay); @@ -1207,7 +1281,7 @@ ncMonster::AttackHolster(void) } void -ncMonster::FreeState(void) +ncMonster::ScriptedSequenceEnded(void) { string to_trigger; m_flSequenceEnd = 0; @@ -1245,9 +1319,14 @@ ncMonster::FreeState(void) to_trigger = m_strRouteEnded; m_strRouteEnded = __NULL__; m_ssLast = __NULL__; + m_flAnimTime = 0.0f; + m_flStopTime = 0.0f; + RouteClear(); /* trigger when required */ if (STRING_SET(to_trigger)) { + ncMonsterLog("Sequence over (hidden: %i, triggering: %S)", m_iSequenceRemove, to_trigger); + for (entity f = world; (f = find(f, ::targetname, to_trigger));) { ncEntity trigger = (ncEntity)f; if (trigger.Trigger != __NULL__) { @@ -1259,12 +1338,10 @@ ncMonster::FreeState(void) if (m_iSequenceRemove) { Hide(); } - - ncMonsterLog("Sequence over (hidden: %i, triggering: %S)", m_iSequenceRemove, to_trigger); } void -ncMonster::FreeStateMoved(void) +ncMonster::ScriptedSequenceEnded_Moved(void) { vector new_origin; new_origin = gettaginfo(this, 1); @@ -1275,11 +1352,11 @@ ncMonster::FreeStateMoved(void) DropToFloor(); } - FreeState(); + ScriptedSequenceEnded(); } void -ncMonster::FreeStateDead(void) +ncMonster::ScriptedSequenceEnded_Dead(void) { vector new_origin; @@ -1294,12 +1371,16 @@ ncMonster::FreeStateDead(void) RemoveFlags(FL_MONSTER); SetSolid(SOLID_CORPSE); SetState(MONSTER_DEAD); - FreeState(); + ScriptedSequenceEnded(); } void ncMonster::RouteEnded(void) { + m_flAnimTime = 0.0f; + ClearVelocity(); + AnimationUpdate(); + super::RouteEnded(); if (GetSequenceState() != SEQUENCESTATE_ACTIVE) @@ -1309,13 +1390,13 @@ ncMonster::RouteEnded(void) if (m_flSequenceEnd) { float duration = frameduration(modelindex, m_flSequenceEnd); m_iSequenceState = SEQUENCESTATE_ENDING; - think = (m_iSequenceFlags & SSFL_NOSCRIPTMOVE) ? FreeState : FreeStateMoved; + think = (m_iSequenceFlags & SSFL_NOSCRIPTMOVE) ? ScriptedSequenceEnded : ScriptedSequenceEnded_Moved; nextthink = time + duration; ncMonsterLog("%s overriding anim for %f seconds (modelindex %d, frame %d)", \ this.targetname, duration, modelindex, m_flSequenceEnd); } else { /* we still need to trigger targets */ - think = (m_iSequenceFlags & SSFL_NOSCRIPTMOVE) ? FreeState : FreeStateMoved; + think = (m_iSequenceFlags & SSFL_NOSCRIPTMOVE) ? ScriptedSequenceEnded : ScriptedSequenceEnded_Moved; nextthink = time; ncMonsterLog("%s has no anim, finished sequence", \ this.targetname); @@ -1329,58 +1410,11 @@ ncMonster::WalkRoute(void) float distToEnemy = 0.0f; vector wishAngle = input_angles; bool followRoute = false; - bool aimAtEnemy = false; bool followEnemy = false; bool stopMovement = false; + input_movevalues = g_vec_null; - if (m_eEnemy) { - zDifference = fabs(m_eEnemy.origin[2] - origin[2]); - distToEnemy = distance(m_eEnemy.origin, GetOrigin()); - } - - /* in range for attacks?... */ - if (GetState() == MONSTER_AIMING) { - bool inSpecial1Range = (distToEnemy < m_flSpecial1Range && m_flSpecial1Range != -1.0) ? true : false; - bool inSpecial2Range = (distToEnemy < m_flSpecial2Range && m_flSpecial2Range != -1.0) ? true : false; - bool inRanged1Range = (distToEnemy < m_flRanged1Range && m_flRanged1Range != -1.0) ? true : false; - bool inRanged2Range = (distToEnemy < m_flRanged2Range && m_flRanged2Range != -1.0) ? true : false; - - if (inSpecial1Range || inSpecial2Range || inRanged1Range || inRanged2Range) { - aimAtEnemy = true; - stopMovement = true; - } - } - - /* are we on the same plane as the player? if not, walk-route there. */ - if (zDifference > 32.0f) { - followRoute = true; - aimAtEnemy = false; - } else if (IsOnRoute()) { /* else, if we're supposed to be following a route, do it. */ - followRoute = true; - } else if (GetState() == MONSTER_CHASING && m_eEnemy) { - followEnemy = true; - aimAtEnemy = true; - } else if (GetState() == MONSTER_AIMING && m_eEnemy) { - followEnemy = true; - aimAtEnemy = true; - stopMovement = true; - } - - if (followRoute && m_iNodes < 0) { - RouteToPosition(m_eEnemy.origin); - } - - if (aimAtEnemy) { - wishAngle = vectorToAngles(m_eEnemy.origin - origin); - wishAngle[0] = wishAngle[2] = 0; - } else if (followRoute) { - wishAngle = GetRouteDirection(); - wishAngle[0] = wishAngle[2] = 0; - } else { - wishAngle = [0, angles[1], 0]; - } - - if (m_flStopTime > time) { + if (m_flStopTime > GetTime() || m_bTurning) { input_movevalues = g_vec_null; if (movetype == MOVETYPE_FLY) { @@ -1389,70 +1423,63 @@ ncMonster::WalkRoute(void) } /* yaw interpolation */ - _LerpTurnToYaw(wishAngle); + _LerpTurnToYaw(ideal_yaw); return; } - if (stopMovement == false) { - if (followEnemy) { - input_movevalues = [GetChaseSpeed(), 0, 0]; - } else if (followRoute) { - if (m_flSequenceSpeed <= 0) { - if (m_eEnemy) - m_flSequenceSpeed = GetChaseSpeed(); - else - m_flSequenceSpeed = GetWalkSpeed(); - } + if (m_iNodes > 0i) { + wishAngle = GetRouteDirection(); + ideal_yaw = wishAngle[1]; - input_movevalues = GetRouteMovevalues() * m_flSequenceSpeed; + if (m_flSequenceSpeed <= 0.0f) { + if (m_eEnemy) + m_flSequenceSpeed = GetChaseSpeed(); + else + m_flSequenceSpeed = GetWalkSpeed(); + } - //printf("Move values: %v\n", input_movevalues); + input_movevalues = GetRouteMovevalues() * m_flSequenceSpeed; - /* is something in our way? */ - tracebox(origin, [-16, -16, -16], [16, 16, 16], origin + anglesToForward(wishAngle) * 256, MOVE_NORMAL, this); + //printf("Move values: %v\n", input_movevalues); - /* indeed it is */ - if (trace_fraction < 1.0f) { - vector testOrg = origin + (anglesToRight(wishAngle) * 32) + anglesToForward(wishAngle) * 128; + /* is something in our way? */ + tracebox(origin, [-16, -16, -16], [16, 16, 16], origin + anglesToForward(wishAngle) * 256, MOVE_NORMAL, this); + + /* indeed it is */ + if (trace_fraction < 1.0f) { + vector testOrg = origin + (anglesToRight(wishAngle) * 32) + anglesToForward(wishAngle) * 128; + testOrg[2] += mins[2] + 18.0f; /* test at feet level */ + + traceline(origin, testOrg, MOVE_NORMAL, this); + + /* is space free to the right? */ + if (trace_fraction == 1.0) { + input_movevalues[1] = m_flSequenceSpeed * 0.25f; + } else { + + testOrg = origin - (anglesToRight(wishAngle) * 32) + anglesToForward(wishAngle) * 128; testOrg[2] += mins[2] + 18.0f; /* test at feet level */ traceline(origin, testOrg, MOVE_NORMAL, this); - /* is space free to the right? */ - if (trace_fraction == 1.0) { - input_movevalues[1] = m_flSequenceSpeed * 0.25f; - } else { - - testOrg = origin - (anglesToRight(wishAngle) * 32) + anglesToForward(wishAngle) * 128; - testOrg[2] += mins[2] + 18.0f; /* test at feet level */ - - traceline(origin, testOrg, MOVE_NORMAL, this); - - /* is space free to the left? */ - if (trace_fraction == 1.0) - input_movevalues[1] = -m_flSequenceSpeed * 0.25f; - } + /* is space free to the left? */ + if (trace_fraction == 1.0) + input_movevalues[1] = -m_flSequenceSpeed * 0.25f; } - } else { - if (movetype == MOVETYPE_FLY) { - input_movevalues[2] = ((m_eEnemy.origin[2] + m_flyOffset) - origin[2]); - input_movevalues[2] += sin(time) * 32.0f; - } - return; } + + } else { + if (movetype == MOVETYPE_FLY) { + input_movevalues[2] = ((m_eEnemy.origin[2] + m_flyOffset) - origin[2]); + input_movevalues[2] += sin(time) * 32.0f; + } + return; } if (movetype == MOVETYPE_FLY) { input_movevalues[2] = ((m_eEnemy.origin[2] + m_flyOffset) - origin[2]); input_movevalues[2] += sin(time) * 32.0f; } - - /* yaw interpolation */ - if (aimAtEnemy) { - _LerpTurnToEnemy(); - } else { - _LerpTurnToYaw(wishAngle); - } } void @@ -1461,63 +1488,76 @@ ncMonster::AnimationUpdate(void) int fr = 0; int act = 0; - if (GetState() == MONSTER_DEAD) + if (GetState() == MONSTER_DEAD) { return; + } - if (GetState() == MONSTER_AIMING) + if (GetState() == MONSTER_AIMING) { return; + } - if (m_bTurning) + if (m_bTurning) { return; + } - float spvel = vlen(velocity); + float spvel = length(velocity); float midspeed = GetWalkSpeed() + ((GetRunSpeed() - GetWalkSpeed()) * 0.5f); + if (m_flStopTime > GetTime()) { + spvel = 0.0f; + } + if (spvel < 5) { - if (m_actIdle == -1) + if (m_actIdle == -1) { m_actIdle = AnimIdle(); + } fr = m_actIdle; if (m_iMoveState != MOVESTATE_IDLE) m_flAnimTime = 0.0f; - if (fr == -1) + if (fr == -1) { act = GetDefAct("idle"); + } m_iMoveState = MOVESTATE_IDLE; } else if (spvel < midspeed) { fr = AnimWalk(); - if (m_iMoveState != MOVESTATE_WALK) + if (m_iMoveState != MOVESTATE_WALK) { m_flAnimTime = 0.0f; + } - if (fr == -1) + if (fr == -1) { act = GetDefAct("walk"); - + } m_iMoveState = MOVESTATE_WALK; } else { fr = AnimRun(); - if (m_iMoveState != MOVESTATE_RUN) + if (m_iMoveState != MOVESTATE_RUN) { m_flAnimTime = 0.0f; + } - if (fr == -1) + if (fr == -1) { act = GetDefAct("run"); + } m_iMoveState = MOVESTATE_RUN; } - if (m_flAnimTime > 0.0f) { + if (InForcedAnimation() == true) { return; } - if (fr == -1) + if (fr == -1) { AnimPlay(act); - else + } else { SetFrame(fr); + } } /* for an ncMonster, health doesn't matter that much, as we could be a corpse */ @@ -1559,8 +1599,9 @@ ncMonster::StateChanged(monsterState_t oldState, monsterState_t newState) void ncMonster::SetState(monsterState_t newState) { - if (newState == m_iMState) + if (newState == m_iMState) { return; + } m_iOldMState = m_iMState; m_iMState = newState; @@ -1580,7 +1621,7 @@ ncMonster::GetSequenceState(void) } bool -ncMonster::InSequence(void) +ncMonster::InScriptedSequence(void) { return (GetSequenceState() == SEQUENCESTATE_NONE) ? false : true; } @@ -1588,7 +1629,14 @@ ncMonster::InSequence(void) void ncMonster::RunAI(void) { - IdleNoise(); + if (GetMovetype() == MOVETYPE_NONE) { + return; + } + + if (InScriptedSequence() == false) { + ScheduleThink(); + } + SeeThink(); AttackThink(); } @@ -1604,12 +1652,14 @@ ncMonster::Physics(void) m_bTurning = false; if (autocvar_ai_enable == false) { + HandleThink(); return; } /* check if we're supposed to be awake */ if (m_pvsSleep == false) { if (SharesPVSWithPlayer() == false) { + HandleThink(); return; } @@ -1626,14 +1676,15 @@ ncMonster::Physics(void) m_flAnimTime = time + 999.0f; frame = m_flForceSequence; m_iSequenceState = SEQUENCESTATE_IDLE; + HandleThink(); return; } /* HACK!!! */ if (!IsAlive()) { - processmodelevents(modelindex, frame, m_flBaseTime, frame1time, HandleAnimEvent); + HandleThink(); return; } @@ -1648,35 +1699,28 @@ ncMonster::Physics(void) SetState(MONSTER_IDLE); } + if (ShouldTurn()) { + _LerpTurnToYaw(ideal_yaw); + } /* we're ending a scripted sequence, so play its animation */ if (GetSequenceState() == SEQUENCESTATE_ENDING) { - _LerpTurnToYaw(m_vecSequenceAngle); + _LerpTurnToYaw(m_vecSequenceAngle[1]); if (m_bTurning == false) SetFrame(m_flSequenceEnd); } else { /* if still alive... */ if (IsAlive()) { - /* only run AI functions when not in a scripted sequence */ - if (InSequence() == false) { - RunAI(); - } - + RunAI(); AnimationUpdate(); } - /* suppress movement when playing an animation outside + /* FIXME: suppress movement when playing an animation outside a scripted sequence */ - if (InSequence() == true) { - input_movevalues = [0,0,0]; - } else if (m_usesNav) { - CheckRoute(); + if (m_usesNav) { + CheckRouteProgression(); WalkRoute(); - } else { - if (IsPerforming() == false) { - SelectNewSchedule(); - } } hitcontentsmaski = CONTENTBITS_MONSTER; @@ -1702,14 +1746,7 @@ ncMonster::Physics(void) processmodelevents(modelindex, frame, m_flBaseTime, frame1time, HandleAnimEvent); - - /* support for think/nextthink */ - if (think && nextthink > 0.0f) { - if (nextthink < time) { - nextthink = 0.0f; - think(); - } - } + HandleThink(); } void @@ -1728,8 +1765,9 @@ ncMonster::Touch(entity eToucher) } } - if (movetype != MOVETYPE_WALK) + if (movetype != MOVETYPE_WALK) { return; + } if (autocvar(pm_pushMonsters, 0)) if (eToucher.movetype == MOVETYPE_WALK) { @@ -1765,6 +1803,17 @@ ncMonster::HasBeenHit(void) /* to be filled in by the sub-class */ } +void +ncMonster::RouteClear(void) +{ + if (m_activeSchedule && m_activeSchedule.ProgressOnMovement()) { + m_activeSchedule.m_bProgressOnMovement = false; + m_activeSchedule.Advance(); + } + + super::RouteClear(); +} + void ncMonster::Pain(entity inflictor, entity attacker, int damage, vector dir, vector absImpactPos, int hitBody) { @@ -1773,16 +1822,38 @@ ncMonster::Pain(entity inflictor, entity attacker, int damage, vector dir, vect float actTwitch = GetDefAct("twitch"); float actPain = -1; float baseHealth = GetSpawnFloat("health"); + float halfHealth = (baseHealth / 2); + float oldHealth = GetHealth() + damage; /* FIXME: unreliable, damage points may have affected armor. */ /* dead things tell nuthin */ if (IsAlive() == false) { return; } - if (GetHealth() <= (baseHealth / 2)) { + if (attacker.classname == "player") { + if (STRING_SET(m_outputOnDamagedByPlayer)) { + UseOutput(attacker, m_outputOnDamagedByPlayer); + } + } else { + if (STRING_SET(m_outputOnDamaged)) { + UseOutput(attacker, m_outputOnDamaged); + } + } + + MessageSchedule("Damage"); + + if (GetHealth() <= halfHealth) { + MessageSchedule("HeavyDamage"); + } else { + MessageSchedule("LightDamage"); + } + + if (GetHealth() <= halfHealth && oldHealth > halfHealth) { if (IsFriend(attacker.m_iAlliance) == true) { m_iAlliance = MAL_ROGUE; } + + UseOutput(attacker, m_outputOnHalfHealth); } if (IsFriend(attacker.m_iAlliance) == true) { @@ -1792,6 +1863,7 @@ ncMonster::Pain(entity inflictor, entity attacker, int damage, vector dir, vect /* if don't have an enemy, set one; else make it random */ if (!m_eEnemy || (random() < 0.5)) { m_eEnemy = m_eLookAt = attacker; + MessageSchedule("NewEnemy"); } /* an alert monster will take a while to calm back down */ @@ -1845,8 +1917,8 @@ ncMonster::Pain(entity inflictor, entity attacker, int damage, vector dir, vect return; } - m_flStopTime = time + frameduration(modelindex, actPain); AnimPlay(actPain); + StartSoundDef(m_sndPain, CHAN_VOICE, true); HasBeenHit(); } @@ -1944,6 +2016,7 @@ ncMonster::Death(entity inflictor, entity attacker, int damage, vector dir, vect } StartSoundDef(m_sndDeath, CHAN_VOICE, true); + UseOutput(attacker, m_outputOnDeath); HasBeenKilled(); g_grMode.NPCDeath(this, (ncActor)inflictor, (ncActor)attacker); @@ -1995,6 +2068,19 @@ ncMonster::Spawned(void) } flags = FL_MONSTER; + + CREATE_OUTPUT(m_outputOnDamaged) + CREATE_OUTPUT(m_outputOnDeath) + CREATE_OUTPUT(m_outputOnHalfHealth) + CREATE_OUTPUT(m_outputOnHearPlayer) + CREATE_OUTPUT(m_outputOnFoundEnemy) + CREATE_OUTPUT(m_outputOnLostEnemy) + CREATE_OUTPUT(m_outputOnLostEnemyLOS) + CREATE_OUTPUT(m_outputOnFoundPlayer) + CREATE_OUTPUT(m_outputOnLostPlayer) + CREATE_OUTPUT(m_outputOnLostPlayerLOS) + CREATE_OUTPUT(m_outputOnDamagedByPlayer) + CREATE_OUTPUT(m_outputOnGreetPlayer) } void @@ -2002,6 +2088,9 @@ ncMonster::Respawn(void) { super::Respawn(); + m_bMetPlayer = false; + m_activeSchedule = __NULL__; + m_mindset = ""; RestoreAngles(); v_angle = fixAngle(GetAngles()); m_vecSequenceAngle = GetAngles(); @@ -2115,22 +2204,148 @@ ncMonster::Input( entity entityActivator, string inputName, string dataField ) case "Wait": float waitTime = stof(dataField); m_flStopTime = GetTime() + waitTime; - m_activeSchedule.AdvanceLater(waitTime); + + if (m_activeSchedule) { + m_activeSchedule.AdvanceLater(waitTime); + } break; case "WaitRandom": - float waitTime = stof(dataField); + float maxRandomTime = stof(dataField); + float randomTime; /* if not specified... make something up */ if (waitTime > 0.0f) { - m_flStopTime = GetTime() + random(0.0f, waitTime); + randomTime = random(0.0f, maxRandomTime); } else { - m_flStopTime = GetTime() + random(0.0f, 1.0f); + randomTime = random(0.0f, 1.0f); } - m_activeSchedule.AdvanceLater(waitTime); + m_flStopTime = GetTime() + randomTime; + + if (m_activeSchedule) { + m_activeSchedule.AdvanceLater(randomTime); + } break; case "WaitIndefinitely": m_flStopTime = (60 * 60) * 24; /* 24 hours is enough... */ + + if (m_activeSchedule) { + m_activeSchedule.AdvanceLater(m_flStopTime); + } + + m_flStopTime += GetTime(); + break; + case "PlayActivity": + if (STRING_SET(dataField)) { + AnimPlay(GetDefAct(dataField)); + + if (m_activeSchedule) { + float waitTime = frameduration(modelindex, frame); + m_activeSchedule.AdvanceLater(waitTime); + } + } + break; + case "PlaySequence": + if (STRING_SET(dataField)) { + AnimationRewind(); + ClearVelocity(); + m_flSequenceSpeed = 0.0f; + AnimPlay(frameforname(modelindex, dataField)); + + if (m_activeSchedule) { + float waitTime = frameduration(modelindex, frame); + m_activeSchedule.AdvanceLater(waitTime); + } + + } else { + NSError("'PlaySequence' without animation sequence, blame %S (%d)", entityActivator, num_for_edict(entityActivator)); + } + break; + case "FindCoverFromEnemy": + vector coverPos = Nodes_FindCoverFromEnemy(this); + + if (vlen(coverPos) > 0.0f) { + RouteToPosition(coverPos); + } else { + CancelSchedule(); + } + break; + case "SetSequenceMovementSpeed": + m_flSequenceSpeed = stof(dataField); + break; + case "SetDesiredSchedule": + m_mindset = dataField; + break; + case "AlertNearbyToSchedule": + m_mindset = dataField; + AlertNearbyToSchedule(dataField); + break; + case "WalkToTarget": + m_flSequenceSpeed = GetWalkSpeed(); + RouteToPosition(m_activeSchedule.GetTarget().origin); + break; + case "RunToTarget": + m_flSequenceSpeed = GetRunSpeed(); + RouteToPosition(m_activeSchedule.GetTarget().origin); + break; + case "CrouchToTarget": + m_flSequenceSpeed = GetDefFloat("speed_crouch"); + RouteToPosition(m_activeSchedule.GetTarget().origin); + break; + case "ProneToTarget": + m_flSequenceSpeed = GetDefFloat("speed_prone"); + RouteToPosition(m_activeSchedule.GetTarget().origin); + break; + case "WaitForMovement": + if (m_iNodes > 0i && m_activeSchedule) { + m_activeSchedule.m_bProgressOnMovement = true; + m_activeSchedule.ReleaseThink(); + } + break; + case "SetFailSchedule": + if (m_activeSchedule) { + m_activeSchedule.SetFailSchedule(dataField); + } + break; + case "Remember": + printf("Rembering %S\n", dataField); + /* TODO: add it to a decl */ + break; + case "WaitPVS": + m_pvsSleep = true; + break; + case "StopMovement": + ClearVelocity(); + ideal_yaw = angles[1]; + break; + case "TurnLeft": + ideal_yaw += stof(dataField); + break; + case "TurnRight": + ideal_yaw -= stof(dataField); + break; + case "TurnToIdealPosition": + ideal_yaw = random(-179,180); + break; + case "TurnToEnemy": + vector turnTo = vectoangles(m_eEnemy.origin - origin); + ideal_yaw = turnTo[1]; + break; + case "AttackMelee1": + AnimationRewind(); + AnimPlay(GetDefAct("meleeAttack1")); + break; + case "AttackMelee2": + AnimationRewind(); + AnimPlay(GetDefAct("meleeAttack2")); + break; + case "AttackRanged1": + AnimationRewind(); + AnimPlay(GetDefAct("rangeAttack1")); + break; + case "AttackRanged2": + AnimationRewind(); + AnimPlay(GetDefAct("rangeAttack2")); break; default: super::Input(entityActivator, inputName, dataField); @@ -2156,6 +2371,42 @@ void ncMonster::SpawnKey(string strKey, string strValue) { switch (strKey) { + case "OnDamaged": + m_outputOnDamaged = PrepareOutput(m_outputOnDamaged, strValue); + break; + case "OnDeath": + m_outputOnDeath = PrepareOutput(m_outputOnDeath, strValue); + break; + case "OnHalfHealth": + m_outputOnHalfHealth = PrepareOutput(m_outputOnHalfHealth, strValue); + break; + case "OnHearPlayer": + m_outputOnHearPlayer = PrepareOutput(m_outputOnHearPlayer, strValue); + break; + case "OnFoundEnemy": + m_outputOnFoundEnemy = PrepareOutput(m_outputOnFoundEnemy, strValue); + break; + case "OnLostEnemy": + m_outputOnLostEnemy = PrepareOutput(m_outputOnLostEnemy, strValue); + break; + case "OnLostEnemyLOS": + m_outputOnLostEnemyLOS = PrepareOutput(m_outputOnLostEnemyLOS, strValue); + break; + case "OnFoundPlayer": + m_outputOnFoundPlayer = PrepareOutput(m_outputOnFoundPlayer, strValue); + break; + case "OnLostPlayer": + m_outputOnLostPlayer = PrepareOutput(m_outputOnLostPlayer, strValue); + break; + case "OnLostPlayerLOS": + m_outputOnLostPlayerLOS = PrepareOutput(m_outputOnLostPlayerLOS, strValue); + break; + case "OnDamagedByPlayer": + m_outputOnDamagedByPlayer = PrepareOutput(m_outputOnDamagedByPlayer, strValue); + break; + case "OnGreetPlayer": + m_outputOnGreetPlayer = PrepareOutput(m_outputOnGreetPlayer, strValue); + break; /* The legacy GoldSrc trigger condition system */ case "TriggerCondition": m_iTriggerCondition = ReadInt(strValue); @@ -2555,6 +2806,7 @@ ncMonster_AlertEnemyAlliance(vector pos, float radius, int alliance) return; } +#if 0 if (autocvar_ai_debugAlerts) NSLog("AI alert from %v with radius %f and alliance %i", pos, radius, alliance); @@ -2602,7 +2854,7 @@ ncMonster_AlertEnemyAlliance(vector pos, float radius, int alliance) f.m_flSequenceSpeed = f.GetWalkSpeed(); f.AlertNoise(); } - +#endif g_monsteralert_timer = time + 0.5f; } diff --git a/src/shared/NSNavAI.h b/src/shared/NSNavAI.h index dfd91f21..7efc5070 100644 --- a/src/shared/NSNavAI.h +++ b/src/shared/NSNavAI.h @@ -165,9 +165,12 @@ public: /** Overridable: Called regularily to select a new schedule to perform. */ virtual void SelectNewSchedule(void); + nonvirtual void ScheduleThink(void); /** Forces a named schedule to be performed. */ + nonvirtual bool CancelSchedule(void); nonvirtual void PerformSchedule(string); + nonvirtual void MessageSchedule(string); nonvirtual bool IsPerforming(void); /* methods we'd like others to override */ @@ -187,7 +190,7 @@ public: /** When called, will wipe any memory of an ongoing route. */ virtual void RouteClear(void); /** Internal use only. Called every frame to see our route progression. */ - virtual void CheckRoute(void); + virtual void CheckRouteProgression(void); /** When called, will plot a route to a given world coordinate and start moving. */ virtual void RouteToPosition(vector); /** When called, will plot a route to a given world coordinate and start moving, ignoring any links that contain the given link flags. */ @@ -195,7 +198,7 @@ public: /** When called, will start following a path_corner */ virtual void ChasePath(string startPath); /** Internal use only. Called every frame to see our route progression. */ - virtual void CheckRoute_Path(void); + virtual void CheckRouteProgression_Path(void); /** Overridable: Called when the entity is ready to move. When overridden, will no longer move until super function is called, or physics is handled within. */ virtual void Physics_Run(void); #endif @@ -215,6 +218,7 @@ private: vector m_vecRouteEntity; entity m_eFollowing; float m_flMoveSpeedKey; + string m_mindset; #endif /* sounds, may even be predicted. */ diff --git a/src/shared/NSNavAI.qc b/src/shared/NSNavAI.qc index 233a1700..fb474bc9 100644 --- a/src/shared/NSNavAI.qc +++ b/src/shared/NSNavAI.qc @@ -19,6 +19,7 @@ void ncActor::ncActor(void) { #ifdef SERVER + m_activeSchedule = __NULL__; m_iNodes = 0i; m_iCurNode = -1i; m_pRoute = __NULL__; @@ -342,10 +343,29 @@ ncActor::RestoreComplete(void) RouteToPosition(m_vecLastNode); } +void +ncActor::ScheduleThink(void) +{ + if (IsPerforming() == false && m_iNodes <= 0i) { + SelectNewSchedule(); + } +} + void ncActor::SelectNewSchedule(void) { + string schedule; + string currentMindset = "idle"; + if (STRING_SET(m_mindset)) { + currentMindset = m_mindset; + } + + schedule = GetDefString(strcat("mindset_", currentMindset)); + + if (STRING_SET(schedule)) { + PerformSchedule(schedule); + } } bool @@ -354,14 +374,37 @@ ncActor::IsPerforming(void) return (m_activeSchedule) ? (true) : (false); } +bool +ncActor::CancelSchedule(void) +{ + if (m_activeSchedule) { + m_activeSchedule.ReleaseThink(); + m_activeSchedule.Cancel(); + return (true); + } + + return (false); +} + +void +ncActor::MessageSchedule(string messageString) +{ + if (m_activeSchedule) { + m_activeSchedule.Message(messageString); + } +} + void ncActor::PerformSchedule(string scheduleDecl) { - if (m_activeSchedule) { - m_activeSchedule.Cancel(); + float scheduleCount = tokenizebyseparator(scheduleDecl, ","); + + if (scheduleCount > 1i) { + scheduleDecl = argv(floor(random(0, scheduleCount))); } + CancelSchedule(); ncSchedule::CreateSchedule(this, scheduleDecl); } @@ -398,27 +441,77 @@ ncActor::Input(entity eAct, string strInput, string strData) } break; /* schedule management */ + case "ActorThinks": + printf("%S (%d): %s\n", classname, num_for_edict(this), strData); + break; + case "ChangeMindset": + m_mindset = strData; + break; case "PerformSchedule": PerformSchedule(strData); break; /* some tasks. */ case "WalkToTarget": RouteToPosition(m_activeSchedule.GetTarget().origin); + m_activeSchedule.AdvanceLater(100); break; case "RunToTarget": RouteToPosition(m_activeSchedule.GetTarget().origin); + m_activeSchedule.AdvanceLater(100); break; case "CrouchToTarget": RouteToPosition(m_activeSchedule.GetTarget().origin); + m_activeSchedule.AdvanceLater(100); break; case "ProneToTarget": RouteToPosition(m_activeSchedule.GetTarget().origin); + m_activeSchedule.AdvanceLater(100); break; case "TargetNearestPlayer": - m_activeSchedule.SetTarget(find(world, ::classname, "player")); - m_activeSchedule.Advance(); + entity firstPlayer = find(world, ::classname, "player"); + + if (firstPlayer) { + m_activeSchedule.SetTarget(firstPlayer); + } else { + CancelSchedule(); + } // NSWarning("Task %S unimplemented", strInput); break; + case "GoToCover": + vector coverPos = Nodes_FindCoverFromPosition(this, GetOrigin()); + + if (vlen(coverPos) > 0.0f) { + RouteToPosition(coverPos); + } else { + CancelSchedule(); + } + break; + case "GoToSpotInRadius": + vector t = Nodes_FindEmptySpotNearPosition(this, GetOrigin(), 128.0f, stof(strData)); + + if (vlen(t) > 0.0f) { + RouteToPosition(t); + } else { + CancelSchedule(); + } + break; + case "AvoidSpotInRadius": + vector t = Nodes_FindEmptySpotAwayFromPosition(this, GetOrigin(), 0.0f, stof(strData)); + + if (vlen(t) > 0.0f) { + RouteToPosition(t); + } else { + CancelSchedule(); + } + break; + case "TurnToRandomYaw": + float randomYaw = random(45.0f,180.0f) - 90.0f; + angles[1] += randomYaw; + v_angle = angles; + break; + case "GoForward": + RouteToPosition(GetOrigin() + (anglesToForward(angles) * 1024.0f)); + break; default: super::Input(eAct, strInput, strData); } @@ -430,14 +523,11 @@ ncActor::Input(entity eAct, string strInput, string strData) void ncActor::RouteEnded(void) { - if (m_activeSchedule) { - m_activeSchedule.Advance(); - } ClearVelocity(); } void -ncActor::CheckRoute_Path(void) +ncActor::CheckRouteProgression_Path(void) { float flDist = distance(m_pathEntity.GetOrigin(), GetOrigin()); @@ -459,7 +549,7 @@ ncActor::CheckRoute_Path(void) } void -ncActor::CheckRoute(void) +ncActor::CheckRouteProgression(void) { float flDist; float flNodeRadius; @@ -473,7 +563,7 @@ ncActor::CheckRoute(void) } if (STRING_SET(m_pathTarget) && m_pathEntity) { - CheckRoute_Path(); + CheckRouteProgression_Path(); return; } @@ -503,7 +593,7 @@ ncActor::CheckRoute(void) if (m_iCurNode < 0) { evenpos = m_vecLastNode; evenpos[2] = origin[2]; - flNodeRadius = 16.0f; + flNodeRadius = 8.0f; } else { evenpos = m_pRoute[m_iCurNode].dest; evenpos[2] = origin[2]; @@ -513,10 +603,13 @@ ncActor::CheckRoute(void) flNodeRadius = 16.0f; } + vector wishAngles = vectoangles(evenpos - origin); + ideal_yaw = wishAngles[1]; + flDist = floor(vlen(evenpos - origin)); if (flDist < flNodeRadius) { - ncActor_Log("%S reached node", targetname); + //ncActor_Log("%S reached node", targetname); m_iCurNode--; velocity = [0,0,0]; /* clamp friction */ @@ -527,7 +620,9 @@ ncActor::CheckRoute(void) /* can we walk directly to our target destination? */ if (trace_fraction == 1.0) { + vector idealAngles = vectoangles(m_vecLastNode - origin); ncActor_Log("Walking directly to last node at '%v'", m_vecLastNode); + ideal_yaw = idealAngles[1]; m_iCurNode = -1; } } @@ -544,8 +639,11 @@ ncActor::CheckRoute(void) /* it's accessible */ if (!trace_startsolid && trace_fraction == 1.0f) { + vector idealAngles = vectoangles(vecNextNode - origin); evenpos = vecNextNode; m_iCurNode = iNextNode; + + ideal_yaw = idealAngles[1]; ncActor_Log("Skipping to next node %i at '%v'", iNextNode, vecNextNode); return; } @@ -707,22 +805,25 @@ ncActor::RouteToPositionDenyFlags(vector destination, int denylinkflags) if (numnodes < 1i) { ncActor_Log("No path available."); - return; } - p.m_iNodes = numnodes; - p.m_iCurNode = numnodes - 1; - p.m_pRoute = nodelist; - p._m_flRouteGiveUp = time + 4.0f; + { + p.m_iNodes = numnodes; + p.m_iCurNode = numnodes - 1; + p.m_pRoute = nodelist; + p._m_flRouteGiveUp = time + 4.0f; + } //traceline(p.origin, dest, MOVE_NORMAL, this); - tracebox(p.origin, [-16, -16, -16], [16, 16, 16], dest, MOVE_NORMAL, this); + tracebox(p.origin, p.mins, p.maxs, dest, MOVE_NORMAL, p); /* can we walk directly to our target destination? */ if (trace_fraction == 1.0) { ncActor_Log("Walking directly to last node"); + p.m_iNodes = 1; p.m_iCurNode = -1; - } else { + p._m_flRouteGiveUp = time + 5.0f; + } else if (numnodes > 0i) { ncActor_Log("Path obstructed, calculating route"); /* run through all nodes, mark the closest direct path possible */ @@ -752,17 +853,16 @@ ncActor::RouteToPositionDenyFlags(vector destination, int denylinkflags) } RouteClear(); - - if (!m_iNodes) { - route_calculate(this, destination, denylinkflags, RouteToPosition_RouteCB); - m_vecLastNode = destination; - } + this.origin[2] += 16.0f; + route_calculate(this, destination, denylinkflags, RouteToPosition_RouteCB); + this.origin[2] -= 16.0f; + m_vecLastNode = destination; } void ncActor::ChasePath(string startPath) { - if (STRING_SET(startPath)) { + if (!STRING_SET(startPath)) { m_pathTarget = __NULL__; m_pathEntity = __NULL__; return; @@ -776,8 +876,9 @@ ncActor::ChasePath(string startPath) void ncActor::RouteClear(void) { - if (!m_iNodes) + if (!m_iNodes) { return; + } m_iCurNode = BOTROUTE_END; m_iNodes = 0; @@ -836,8 +937,7 @@ ncActor::LaunchProjectile(string defName, bool thrown, float timeOfs) nade.SetWeaponOwner(m_activeWeapon); nade.Launch(GetEyePos(), GetViewAngle(), time - timeOfs, 0.0f, 0.0f); - makevectors(throwDirection); - nade.SetVelocity((v_forward * throwingStrength) + GetVelocity()); + nade.SetVelocity((anglesToForward(throwDirection) * throwingStrength) + GetVelocity()); #endif } @@ -873,7 +973,7 @@ ncActor::PlantCharge(string defName) plantedEntity.SetOwner(this); plantedEntity.real_owner = this; - printf("Planted %S at %v\n", plantedEntity.classname, origin); + EntLog("Planted %S at %v\n", plantedEntity.classname, origin); #endif /* push us outta the way! */ @@ -886,8 +986,9 @@ int ncActor::GetReserveAmmo(int ammoType) { /* bounds check */ - if (ammoType <= 0i || ammoType >= MAX_AMMO_TYPES) + if (ammoType <= 0i || ammoType >= MAX_AMMO_TYPES) { return (0i); + } return (m_iAmmoTypes[ammoType]); } @@ -938,8 +1039,9 @@ ncActor::GiveAmmo(int ammoType, int ammoAmount) m_iAmmoTypes[ammoType] += ammoAmount; - if (m_iAmmoTypes[ammoType] >= maxAmmo) + if (m_iAmmoTypes[ammoType] >= maxAmmo) { m_iAmmoTypes[ammoType] = maxAmmo; + } return (true); } @@ -952,8 +1054,9 @@ ncActor::UseAmmo(int ammoType, int ammoAmount) } /* bounds check */ - if (HasAmmo(ammoType, ammoAmount) == false) + if (HasAmmo(ammoType, ammoAmount) == false) { return (false); + } m_iAmmoTypes[ammoType] -= ammoAmount; return (true); @@ -963,12 +1066,14 @@ bool ncActor::HasAmmo(int ammoType, int ammoAmount) { /* bounds check */ - if (ammoType < 0i || ammoType >= MAX_AMMO_TYPES) + if (ammoType < 0i || ammoType >= MAX_AMMO_TYPES) { return (false); + } /* will underflow when used. */ - if ((m_iAmmoTypes[ammoType] - ammoAmount) < 0i) + if ((m_iAmmoTypes[ammoType] - ammoAmount) < 0i) { return (false); + } return (true); } diff --git a/src/shared/NSTalkMonster.h b/src/shared/NSTalkMonster.h index f3371ad6..d29db2cb 100644 --- a/src/shared/NSTalkMonster.h +++ b/src/shared/NSTalkMonster.h @@ -102,6 +102,7 @@ public: virtual void OnPlayerUse(void); //virtual void Hide(void); virtual void Respawn(void); + virtual void Input(entity,string,string); virtual void SpawnKey(string,string); virtual float SendEntity(entity,float); virtual void Save(float); diff --git a/src/shared/NSTalkMonster.qc b/src/shared/NSTalkMonster.qc index 4dcbde31..23de36fc 100644 --- a/src/shared/NSTalkMonster.qc +++ b/src/shared/NSTalkMonster.qc @@ -313,6 +313,18 @@ ncTalkMonster::Speak(string sentence) multicast(origin, MULTICAST_PVS); } +void +ncTalkMonster::Input(entity activatorEntity, string inputName, string dataField) +{ + switch (inputName) { + case "SpeakSentence": + Sentence(dataField); + break; + default: + super::Input(activatorEntity, inputName, dataField); + } +} + void ncTalkMonster::SeenPlayer(ncActor thePlayer) { @@ -568,7 +580,7 @@ ncTalkMonster::FollowPlayer(void) input_angles[0] = 0; input_angles[1] = fixAngleDelta(input_angles[1]); input_angles[2] = 0; - _LerpTurnToYaw(input_angles); + _LerpTurnToYaw(input_angles[1]); /* for best results, we want to ignore the Z plane this avoids the problem of a follower spinning @@ -635,7 +647,7 @@ ncTalkMonster::FollowPlayer(void) input_angles[0] = 0; input_angles[1] = fixAngleDelta(input_angles[1]); input_angles[2] = 0; - _LerpTurnToYaw(input_angles); + _LerpTurnToYaw(input_angles[1]); } } else { m_vecLastUserPos = vecParent; @@ -719,16 +731,17 @@ ncTalkMonster::RunAI(void) return; } + if (InScriptedSequence() == false) { + ScheduleThink(); + } + SeeThink(); AttackThink(); - FollowChain(); #if 0 if (m_eFollowing != world && m_iNodes <= 0) { m_eLookAt = m_eFollowing; FollowPlayer(); - } else if (m_iFlags & MONSTER_FEAR) { - PanicFrame(); } else { if (random() < 0.5) { TalkPlayerAsk(); @@ -1187,7 +1200,7 @@ ncTalkMonster_ParseSentence(void) ent = findfloat(world, entnum, e); if (ent) { - if (ent.classname != "speaker" && ent.classname != "ncTalkMonster" && ent.classname != "ambient_generic") { + if (ent.classname != "speaker" && ent.declclass != "ncTalkMonster" && ent.classname != "ncTalkMonster" && ent.classname != "ambient_generic") { NSError("Entity %d not a ncTalkMonster!", e); } else { targ = (ncTalkMonster)ent; diff --git a/src/shared/activities.qc b/src/shared/activities.qc index bd1faa62..ca618869 100644 --- a/src/shared/activities.qc +++ b/src/shared/activities.qc @@ -73,7 +73,7 @@ Activities_GetSequenceForEntity(ncEntity targetEntity, string activityName) if (!STRING_SET(fireValue)) { float actValue = Activities_GetActID(actNameCheck); - if (actValue == ACTIVITY_NOTFOUND) { + if (actValue != ACTIVITY_NOTFOUND) { /* look it up in the model itself now */ float frameGroup = frameforaction(targetEntity.modelindex, actValue); return (frameGroup); diff --git a/src/shared/api.h b/src/shared/api.h index 8f9e1e68..e0704335 100644 --- a/src/shared/api.h +++ b/src/shared/api.h @@ -443,6 +443,22 @@ typedef struct declAPI_t declManager; /** @} */ // end of shared +void +setorigin_safe(entity target, vector testorg) +{ + for (int i = 0; i < 16; i++) { + tracebox(testorg, target.mins, target.maxs, testorg, MOVE_NORMAL, target); + + if (!trace_startsolid) { + break; + } + + testorg[2] += 1.0; + } + + setorigin(target, testorg); +} + __variant linkToSharedProgs(string funcName) { diff --git a/src/shared/defs.h b/src/shared/defs.h index 5ea9abe0..74f0cf4d 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -16,6 +16,9 @@ #include "../common/defs.h" +.float w_reload_next; +.float w_attack_next; + /* networking helpers */ #define NETWORKED_INT(x) int x; int x ##_net; #define NETWORKED_FLOAT(x) float x; float x ##_net; @@ -383,22 +386,6 @@ traceline(vector v1, vector v2, float flags, entity ent) prior(v1, v2, flags, ent); } -void -setorigin_safe(entity target, vector testorg) -{ - for (int i = 0; i < 16; i++) { - tracebox(testorg, target.mins, target.maxs, testorg, MOVE_NORMAL, target); - - if (!trace_startsolid) { - break; - } - - testorg[2] += 1.0; - } - - setorigin(target, testorg); -} - #ifdef SERVER string Skill_GetStringValue(string, string); #endif diff --git a/src/shared/player_pmove.qc b/src/shared/player_pmove.qc index 1a1577db..23245b89 100644 --- a/src/shared/player_pmove.qc +++ b/src/shared/player_pmove.qc @@ -75,7 +75,7 @@ ncPlayer::Physics_Fall(float flDownforce) ncDict damageDecl = spawn(ncDict); damageDecl.AddKey("damage", itos((int)finalDamage)); damageDecl.AddKey("noArmor", "1"); - Damage(this, this, damageDecl, 1.0, g_vec_null, GetOrigin() + [0,0, mins[2]]); + Damage(this, world, damageDecl, 1.0, g_vec_null, GetOrigin() + [0,0, mins[2]]); remove(damageDecl); //Damage_Apply(this, world, fFallDamage, 0, DMG_FALL | DMG_SKIP_ARMOR); @@ -595,7 +595,6 @@ ncPlayer::Physics_Run(void) RemoveVFlags(VFL_SPRINTING); } - /* maxspeed changes when crouching, TODO: make this game-specific */ maxspeed = Physics_MaxSpeed(); #ifdef SERVER diff --git a/src/shared/propdata.qc b/src/shared/propdata.qc index d4280c2c..7c1a48b5 100644 --- a/src/shared/propdata.qc +++ b/src/shared/propdata.qc @@ -207,7 +207,7 @@ PropData_ParseField(int i, string keyName, string setValue) g_propdata[i].breakable_particle = setValue; break; case "breakable_model": - g_propdata[i].breakable_model = setValue; + g_propdata[i].breakable_model = strtolower(setValue); break; case "breakable_count": g_propdata[i].breakable_count = stoi(setValue);