From b6f9242752525ba3d31c8cae0540fd857e7a99ae Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Fri, 27 Nov 2020 03:05:21 +0100 Subject: [PATCH] info_particle_system: Initial implementation, along with example map test_particles. --- .../test_maps.pk3dir/maps/test_particles.bsp | Bin 0 -> 1591212 bytes .../test_maps.pk3dir/maps/test_particles.map | 140 ++++++++++ src/client/entry.c | 8 +- .../client/info_particle_system.cpp | 106 +++++++ src/gs-entbase/server/light_dynamic.cpp | 7 +- src/gs-entbase/shared.src | 1 + src/gs-entbase/shared/baseentity.cpp | 25 +- .../shared/info_particle_system.cpp | 259 ++++++++++++++++++ src/shared/entities.h | 1 + 9 files changed, 536 insertions(+), 11 deletions(-) create mode 100644 platform/test_maps.pk3dir/maps/test_particles.bsp create mode 100644 platform/test_maps.pk3dir/maps/test_particles.map create mode 100644 src/gs-entbase/client/info_particle_system.cpp create mode 100644 src/gs-entbase/shared/info_particle_system.cpp diff --git a/platform/test_maps.pk3dir/maps/test_particles.bsp b/platform/test_maps.pk3dir/maps/test_particles.bsp new file mode 100644 index 0000000000000000000000000000000000000000..988bd92fe73210dc7ea22bee175a560bcf9db7ab GIT binary patch literal 1591212 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

1jQotL^yC_G3F%e`Uj( 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

c3}Q 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pkQQ+#;tJw~>-+ud@ciwru?yjp> z$A2XmkI~+}duO8KCMKgjd-lBJjyp2ZvD1^$UcGwt=+Pq)os^9B>C-1ujN^{W8uy-i z?#YUdc`#E9VfgUjnPP1F@W@OtgxuWROfg1>&(0LPwT&91ijvW|qW=B+U$2R69~s&$ zI%v?KOf+Z8ZMWUlbwjl3*RNkDI&x_;8hehfO!T3Gc-?hFca2eB?&>yP+;`u7nPQyP zsD51yWBs^sI|P^|BMHXaJeo`()i zY*}nO^g=Q^di3b5p6@@FjApfs8aaQQ95){IzJ2><<~;IBvTeN1Y*QR}z`rG z@7#_O!J@ul7E7M({c^9GD#$DW7ujJc=cec0f^}C)< zmohhZw9VWc+m7rNr_?p=xVc?3Z11`MqcPM~bNAhMXSKbzx~pLvA}%&7+V_>NhB4ZG z_aFGLWZSGgisKF)n2cr)WP3+fuiif|8O>_jzQ2{p^$r;_By)3YJK}OOI(F>X%p_y9 z*ZY}b2vH-e?U1bfjVC87`oLc#+jd`X&Y5I1bEvMZ=;2S2(a*g1+mg|B>(*tK5ZBw| zN15Uc-uvH9M&r54n)4&4lhMJ02WLe`yqg?1K0>pi5B*It8q-at7$ryjI8zLv`)Pml z-;?8h=E?tlGCF?z_)IabclfbP@di)+BgtqykXd(rQuAO%Y93slng>^>=E3!;d2mx| z9$c522iKZ0AI5iKhOwEHusd;d9Y94$lH4i?Sng^dw&4cTXCC~F`p8Q9?(f$nn z0>5qxJ;LpwXXq8~2zQ3w;o7&0KH*E@?$9^%3;n}@a8LM+4uN~aePLi26z&g$!;tWs z;en3Y-wIz2L&Jk%Sgai$a>9s?+L7U*@Rjgz7!_-OJ3JB|?Wi3c#)Pq9T*wXM!-Oy~ zTub+PVRD!friN)DFXV^mVMfQjzsz4V!>mvcW`{XpZkQM5hr*7=kA($cVR$?&3X8*% zurz$Nqjp(X9#(`W!joZT_*!@>tm>$JI;;+B!rD+2YuANmLUBj!`cM)|!-lXi)|Q3x zu&JZ=*-#NShb^HpYz^B&RoLE9`&`%&szXh9K0Ft8hF#(79kn<9>v#I(Y^W@$uHII% zwJc{?&aSE*l^d(Km+ab>)91xL-GUX{%BzaESC;H9+fiIyQ?jGxf4OI4SxL>aTT5y- zJbV4dtyLS#D&r`RjL+$lvuxY)9c9(kWgBBfc~wLgDJvw*vnD%&bTIJ7g z+fZEkd`(SN=e)YQn(%pD#rgeT`-;;j+0?%L<*`x4hRU*Gg6Y^r;W##2%8)}NL?{!UCbr56*OYB-KL8yEu>B`7oj-1B|F``+a_9Ht_Ht*e^S<_2`*r)D&iguJ Lv8v literal 0 HcmV?d00001 diff --git a/platform/test_maps.pk3dir/maps/test_particles.map b/platform/test_maps.pk3dir/maps/test_particles.map new file mode 100644 index 00000000..b7ce7856 --- /dev/null +++ b/platform/test_maps.pk3dir/maps/test_particles.map @@ -0,0 +1,140 @@ + +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( 248 192 -64 ) ( 248 -192 -64 ) ( -264 192 -64 ) measure/floor [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 256 192 8 ) ( -256 192 8 ) ( 256 192 0 ) measure/floor [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 256 192 8 ) ( 256 192 0 ) ( 256 -192 8 ) measure/floor [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 -128 ) ( 256 -192 -128 ) ( -256 192 -128 ) measure/floor [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 0 ) ( -256 -192 8 ) ( 256 -192 0 ) measure/floor [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 0 ) ( -256 192 0 ) ( -256 -192 8 ) measure/floor [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +// brush 1 +{ +( 248 192 192 ) ( 248 -192 192 ) ( -264 192 192 ) measure/floor [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 256 192 264 ) ( -256 192 264 ) ( 256 192 256 ) measure/floor [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 256 192 264 ) ( 256 192 256 ) ( 256 -192 264 ) measure/floor [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 128 ) ( 256 -192 128 ) ( -256 192 128 ) measure/floor [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 256 ) ( -256 -192 264 ) ( 256 -192 256 ) measure/floor [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -256 -192 256 ) ( -256 192 256 ) ( -256 -192 264 ) measure/floor [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +// brush 2 +{ +( 184 192 192 ) ( 184 -192 192 ) ( -328 192 192 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 192 192 264 ) ( -320 192 264 ) ( 192 192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -256 192 8 ) ( -256 192 0 ) ( -256 -192 8 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -768 -192 -128 ) ( -256 -192 -128 ) ( -768 192 -128 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( -320 -192 256 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -320 -192 256 ) ( -320 192 256 ) ( -320 -192 264 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +// brush 3 +{ +( 760 192 192 ) ( 760 -192 192 ) ( 248 192 192 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 768 192 264 ) ( 256 192 264 ) ( 768 192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 320 192 8 ) ( 320 192 0 ) ( 320 -192 8 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -192 -192 -128 ) ( 320 -192 -128 ) ( -192 192 -128 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 256 -192 256 ) ( 256 -192 264 ) ( 768 -192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 256 -192 256 ) ( 256 192 256 ) ( 256 -192 264 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +// brush 4 +{ +( 184 -192 192 ) ( 184 -576 192 ) ( -328 -192 192 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 192 -192 264 ) ( -320 -192 264 ) ( 192 -192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 320 96 8 ) ( 320 96 0 ) ( 320 -288 8 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -768 -576 -128 ) ( -256 -576 -128 ) ( -768 -192 -128 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 272 -256 256 ) ( 272 -256 264 ) ( 784 -256 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -320 -576 256 ) ( -320 -192 256 ) ( -320 -576 264 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +// brush 5 +{ +( 184 256 192 ) ( 184 -128 192 ) ( -328 256 192 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 192 256 264 ) ( -320 256 264 ) ( 192 256 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 320 544 8 ) ( 320 544 0 ) ( 320 160 8 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -768 -128 -128 ) ( -256 -128 -128 ) ( -768 256 -128 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 272 192 256 ) ( 272 192 264 ) ( 784 192 256 ) measure/wall128gr [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( -320 -128 256 ) ( -320 256 256 ) ( -320 -128 264 ) measure/wall128gr [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +} +// entity 1 +{ +"classname" "info_player_start" +} +// entity 2 +{ +"classname" "info_player_deathmatch" +} +// entity 3 +{ +"classname" "light" +"origin" "192.000000 128.000000 64.000000" +"light" "50" +} +// entity 4 +{ +"classname" "light" +"origin" "192.000000 -128.000000 64.000000" +"light" "50" +} +// entity 5 +{ +"classname" "func_button" +"OnPressed" "foobar,Stop,,0,-1" +// brush 0 +{ +( 88 -40 0 ) ( 88 -80 0 ) ( 48 -40 0 ) next/rusty7 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 88 -48 72 ) ( 48 -48 72 ) ( 88 -48 64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 80 -40 72 ) ( 80 -40 64 ) ( 80 -80 72 ) next/rusty7 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 48 -80 -64 ) ( 88 -80 -64 ) ( 48 -40 -64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 40 -80 64 ) ( 40 -80 72 ) ( 80 -80 64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 48 -80 64 ) ( 48 -40 64 ) ( 48 -80 72 ) next/rusty7 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +} +// entity 6 +{ +"classname" "func_button" +"OnPressed" "foobar,Start,,0,-1" +// brush 0 +{ +( 88 152 0 ) ( 88 112 0 ) ( 48 152 0 ) next/rusty7 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 88 144 72 ) ( 48 144 72 ) ( 88 144 64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 80 152 72 ) ( 80 152 64 ) ( 80 112 72 ) next/rusty7 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 48 112 -64 ) ( 88 112 -64 ) ( 48 152 -64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -1 -0 0 ] -0 0.5 0.5 0 0 0 +( 40 112 64 ) ( 40 112 72 ) ( 80 112 64 ) next/rusty7 [ 1 0 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +( 48 112 64 ) ( 48 152 64 ) ( 48 112 72 ) next/rusty7 [ 0 1 0 0 ] [ -0 -0 -1 0 ] -0 0.5 0.5 0 0 0 +} +} +// entity 7 +{ +"classname" "light" +"origin" "-192.000000 128.000000 64.000000" +"light" "25" +} +// entity 8 +{ +"classname" "light" +"origin" "-192.000000 -64.000000 64.000000" +"light" "25" +"style" "9" +} +// entity 9 +{ +"classname" "point_message" +"origin" "64.000000 128.000000 32.000000" +"message" "Particle Emitter: On" +} +// entity 10 +{ +"classname" "point_message" +"origin" "64.000000 -64.000000 32.000000" +"message" "Particle Emitter: Off" +} +// entity 11 +{ +"classname" "info_particle_system" +"origin" "128.000000 32.000000 32.000000" +"targetname" "foobar" +"effect_name" "test.ball" +"interval" "0.25" +} diff --git a/src/client/entry.c b/src/client/entry.c index ef5f7ead..7d71cf74 100644 --- a/src/client/entry.c +++ b/src/client/entry.c @@ -838,7 +838,6 @@ CSQC_Ent_Update(float new) } spr.ReceiveEntity(readfloat()); break; - break; case ENT_SPRAY: Spray_Parse(); break; @@ -862,6 +861,13 @@ CSQC_Ent_Update(float new) } l.ReceiveEntity(readfloat()); break; + case ENT_PARTSYSTEM: + info_particle_system ips = (info_particle_system)self; + if (new) { + spawnfunc_info_particle_system(); + } + ips.ReceiveEntity(readfloat()); + break; default: if (Game_Entity_Update(t, new) == FALSE) { error("Unknown entity type update received.\n"); diff --git a/src/gs-entbase/client/info_particle_system.cpp b/src/gs-entbase/client/info_particle_system.cpp new file mode 100644 index 00000000..af660c24 --- /dev/null +++ b/src/gs-entbase/client/info_particle_system.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* this has to match gs-entbase/server/info_particle_system.cpp! */ +enumflags +{ + DLIGHTFL_CHANGED_ORIGIN, + DLIGHTFL_CHANGED_ANGLES, + DLIGHTFL_CHANGED_LIGHT, + DLIGHTFL_CHANGED_INTENSITY, + DLIGHTFL_CHANGED_INNERCONE, + DLIGHTFL_CHANGED_CONE, + DLIGHTFL_CHANGED_DISTANCE, + DLIGHTFL_CHANGED_RADIUS, + DLIGHTFL_CHANGED_STYLE, + DLIGHTFL_CHANGED_STATE +}; + +class info_particle_system +{ + vector m_vecLight; + float m_flIntensity; + float m_flInnerCone; + float m_flCone; + float m_flDistance; + float m_flRadius; + float m_flStyle; + int m_iState; + + void(void) info_particle_system; + + virtual void(float) ReceiveEntity; +}; + +float +info_particle_system::predraw(void) +{ + if (!m_iState) { + return PREDRAW_NEXT; + } + + /* TODO: We need to handle the second cone light */ + dynamiclight_add(origin, m_flDistance, m_vecLight, m_flStyle); + + addentity(this); + return PREDRAW_NEXT; +} + +void +info_particle_system::ReceiveEntity(float flFlags) +{ + if (flFlags & DLIGHTFL_CHANGED_ORIGIN) { + origin[0] = readcoord(); + origin[1] = readcoord(); + origin[2] = readcoord(); + setorigin(this, origin); + } + + if (flFlags & DLIGHTFL_CHANGED_ANGLES) { + angles[0] = readcoord(); + angles[1] = readcoord(); + angles[2] = readcoord(); + } + + if (flFlags & DLIGHTFL_CHANGED_LIGHT) { + m_vecLight[0] = readbyte() / 255; + m_vecLight[1] = readbyte() / 255; + m_vecLight[2] = readbyte() / 255; + } + + if (flFlags & DLIGHTFL_CHANGED_INTENSITY) + m_flIntensity = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_INNERCONE) + m_flInnerCone = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_CONE) + m_flCone = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_DISTANCE) + m_flDistance = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_RADIUS) + m_flRadius = readfloat(); + if (flFlags & DLIGHTFL_CHANGED_STYLE) + m_flStyle = readbyte(); + if (flFlags & DLIGHTFL_CHANGED_STATE) + m_iState = readbyte(); + + classname = "info_particle_system"; +} + +void +info_particle_system::info_particle_system(void) +{ + drawmask = MASK_ENGINE; +} diff --git a/src/gs-entbase/server/light_dynamic.cpp b/src/gs-entbase/server/light_dynamic.cpp index 0375ecb3..6fd8ecf9 100644 --- a/src/gs-entbase/server/light_dynamic.cpp +++ b/src/gs-entbase/server/light_dynamic.cpp @@ -82,11 +82,8 @@ light_dynamic::ParentUpdate(void) if (m_parent) { entity p = find(world, ::targetname, m_parent); - if (!p) { - return; - } - - SetOrigin(p.origin); + if (p) + SetOrigin(p.origin); } } diff --git a/src/gs-entbase/shared.src b/src/gs-entbase/shared.src index de58f8d1..d9495554 100644 --- a/src/gs-entbase/shared.src +++ b/src/gs-entbase/shared.src @@ -7,4 +7,5 @@ shared/decals.cpp shared/spraylogo.cpp shared/func_friction.cpp shared/trigger_gravity.cpp +shared/info_particle_system.cpp #endlist diff --git a/src/gs-entbase/shared/baseentity.cpp b/src/gs-entbase/shared/baseentity.cpp index f6ab702e..afce16af 100644 --- a/src/gs-entbase/shared/baseentity.cpp +++ b/src/gs-entbase/shared/baseentity.cpp @@ -131,6 +131,7 @@ CBaseEntity::RenderFXPass(void) } #endif +var int autocvar_r_showSkeleton = 0; float CBaseEntity::predraw(void) { @@ -142,6 +143,23 @@ CBaseEntity::predraw(void) RenderFXPass(); #endif + if (autocvar_r_showSkeleton == 1) { + for (int i = 1; i < 64; i++) { + vector v1 = gettaginfo(this, i); + + if (v1 != this.origin) { + makevectors(input_angles); + R_BeginPolygon("textures/dev/model_bone", 0, 0); + R_PolygonVertex(v1 + v_right * 1 - v_up * 1, [1,1], [1,1,1], 1.0f); + R_PolygonVertex(v1 - v_right * 1 - v_up * 1, [0,1], [1,1,1], 1.0f); + R_PolygonVertex(v1 - v_right * 1 + v_up * 1, [0,0], [1,1,1], 1.0f); + R_PolygonVertex(v1 + v_right * 1 + v_up * 1, [1,0], [1,1,1], 1.0f); + R_EndPolygon(); + alpha = 0.25f; + } + } + } + /* mouth flapping action */ bonecontrol5 = getchannellevel(this, CHAN_VOICE) * 20; m_flBaseTime = frame1time; @@ -695,11 +713,8 @@ CBaseEntity::ParentUpdate(void) if (m_parent) { entity p = find(world, ::targetname, m_parent); - if (!p) { - return; - } - - SetOrigin(p.origin); + if (p) + SetOrigin(p.origin); } } diff --git a/src/gs-entbase/shared/info_particle_system.cpp b/src/gs-entbase/shared/info_particle_system.cpp new file mode 100644 index 00000000..c2772d09 --- /dev/null +++ b/src/gs-entbase/shared/info_particle_system.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/*QUAKED info_particle_system (1 0 0) (-8 -8 -8) (8 8 8) +"targetname" Name +"effect_name" Name of the particle effect to spawn +"start_active" Whether or not the entity needs to be triggered first +"interval" Override for spawn intervals. +"spawncount" Override for the amount of particles that will be emitted + +An entity that's spawns particles from the engine's particle system. + +Trivia: +This entity was introduced in The Orange Box (2007). +*/ + +#define PSFL_STARTACTIVE 1 + +enumflags +{ + PARTSYSFL_CHANGED_ORIGIN, + PARTSYSFL_CHANGED_ANGLES, + PARTSYSFL_CHANGED_EFFECT, + PARTSYSFL_CHANGED_STATUS, + PARTSYSFL_CHANGED_INTERVAL, + PARTSYSFL_CHANGED_COUNT +}; + +#ifdef CLIENT +class info_particle_system +#else +class info_particle_system:CBaseTrigger +#endif +{ + string m_strEffectName; + float m_flInterval; + int m_iSpawnCount; + + void(void) info_particle_system; + +#ifdef CLIENT + int m_iValue; + int m_iEffectID; + + virtual void(void) Emit; + virtual void(float) ReceiveEntity; +#else + virtual void(void) Respawn; + virtual void(void) ParentUpdate; + virtual float(entity, float) SendEntity; + virtual void(string, string) SpawnKey; + virtual void(entity, int) Trigger; + virtual void(entity, string, string) Input; +#endif +}; + +#ifdef CLIENT +void +info_particle_system::Emit(void) +{ + if (m_iValue) + if (m_iSpawnCount) + pointparticles((float)m_iEffectID, origin, angles, m_iSpawnCount); + else + pointparticles((float)m_iEffectID, origin, angles, 1); + + nextthink = time + m_flInterval; +} + +void +info_particle_system::ReceiveEntity(float flFlags) +{ + if (flFlags & PARTSYSFL_CHANGED_ORIGIN) { + origin[0] = readcoord(); + origin[1] = readcoord(); + origin[2] = readcoord(); + } + + if (flFlags & PARTSYSFL_CHANGED_ANGLES) { + angles[0] = readfloat(); + angles[1] = readfloat(); + angles[2] = readfloat(); + } + + if (flFlags & PARTSYSFL_CHANGED_EFFECT) { + m_strEffectName = readstring(); + m_iEffectID = particleeffectnum(m_strEffectName); + } + + if (flFlags & PARTSYSFL_CHANGED_STATUS) { + m_iValue = readbyte(); + } + + if (flFlags & PARTSYSFL_CHANGED_INTERVAL) { + m_flInterval = readfloat(); + nextthink = time + m_flInterval; + } + + if (flFlags & PARTSYSFL_CHANGED_COUNT) + m_iSpawnCount = readbyte(); + + classname = "info_particle_system"; + + setorigin(this, origin); + setsize(this, mins, maxs); +} +#else +float +info_particle_system::SendEntity(entity ePVSEnt, float flFlags) +{ + WriteByte(MSG_ENTITY, ENT_PARTSYSTEM); + WriteFloat(MSG_ENTITY, flFlags); + + if (flFlags & PARTSYSFL_CHANGED_ORIGIN) { + WriteCoord(MSG_ENTITY, origin[0]); + WriteCoord(MSG_ENTITY, origin[1]); + WriteCoord(MSG_ENTITY, origin[2]); + } + + if (flFlags & PARTSYSFL_CHANGED_ANGLES) { + WriteFloat(MSG_ENTITY, angles[0]); + WriteFloat(MSG_ENTITY, angles[1]); + WriteFloat(MSG_ENTITY, angles[2]); + } + + if (flFlags & PARTSYSFL_CHANGED_EFFECT) + WriteString(MSG_ENTITY, m_strEffectName); + + if (flFlags & PARTSYSFL_CHANGED_STATUS) + WriteByte(MSG_ENTITY, m_iValue); + + if (flFlags & PARTSYSFL_CHANGED_INTERVAL) + WriteFloat(MSG_ENTITY, m_flInterval); + + if (flFlags & PARTSYSFL_CHANGED_COUNT) + WriteByte(MSG_ENTITY, m_iSpawnCount); + + return TRUE; +} + +void +info_particle_system::ParentUpdate(void) +{ + if (net_origin != origin) { + net_origin = origin; + SendFlags |= PARTSYSFL_CHANGED_ORIGIN; + } + + if (net_angles != angles) { + net_angles = angles; + SendFlags |= PARTSYSFL_CHANGED_ANGLES; + } + + if (m_parent) { + entity p = find(world, ::targetname, m_parent); + + if (p) + SetOrigin(p.origin); + } +} + +void +info_particle_system::Trigger(entity act, int state) +{ + switch (state) { + case TRIG_OFF: + m_iValue = 0; + break; + case TRIG_ON: + m_iValue = 1; + break; + default: + m_iValue = 1 - m_iValue; + } + + SendFlags |= PARTSYSFL_CHANGED_STATUS; +} + +void +info_particle_system::Input(entity eAct, string strInput, string strData) +{ + switch (strInput) { + case "Start": + Trigger(eAct, TRIG_ON); + break; + case "Stop": + Trigger(eAct, TRIG_OFF); + break; + /* out of spec */ + case "Toggle": + Trigger(eAct, TRIG_TOGGLE); + break; + default: + CBaseTrigger::Input(eAct, strInput, strData); + } +} + +void +info_particle_system::SpawnKey(string strKey, string strValue) +{ + switch (strKey) { + case "effect_name": + m_strEffectName = strValue; + break; + case "start_active": + spawnflags |= stoi(strValue); + break; + /* out of spec */ + case "interval": + m_flInterval = stof(strValue); + break; + case "spawncount": + m_iSpawnCount = stoi(strValue); + break; + default: + CBaseTrigger::SpawnKey(strKey, strValue); + } +} + +void +info_particle_system::Respawn(void) +{ + SetSolid(SOLID_NOT); + SetSize([-16,-16,-16], [16,16,16]); + SetOrigin(m_oldOrigin); + SetAngles(m_oldAngle); + + SendFlags = PARTSYSFL_CHANGED_ORIGIN | \ + PARTSYSFL_CHANGED_ANGLES | \ + PARTSYSFL_CHANGED_EFFECT | \ + PARTSYSFL_CHANGED_STATUS | \ + PARTSYSFL_CHANGED_INTERVAL | \ + PARTSYSFL_CHANGED_COUNT; +} +#endif + +void +info_particle_system::info_particle_system(void) +{ +#ifdef CLIENT + drawmask = MASK_ENGINE; + think = Emit; +#elif SERVER + CBaseTrigger::CBaseTrigger(); +#endif +} diff --git a/src/shared/entities.h b/src/shared/entities.h index 57ebbed3..8db058f4 100644 --- a/src/shared/entities.h +++ b/src/shared/entities.h @@ -22,6 +22,7 @@ enum ENT_AMBIENTSOUND, ENT_DLIGHT, ENT_ENVLASER, + ENT_PARTSYSTEM, ENT_SPRITE, ENT_SPRAY, ENT_DECAL,