From d0342b128c60febfd9de9022f749ae845bba266b Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Thu, 22 Oct 2020 02:23:05 +0200 Subject: [PATCH] light_dynamic: Initial implementation. Q3BSP maps can use 'dynamic_light' to avoid confusing the compiler (...). Renamed ReadEntity() to ReceiveEntity(). --- .../test_maps.pk3dir/maps/test_dlights.bsp | Bin 0 -> 1588312 bytes .../test_maps.pk3dir/maps/test_dlights.map | 149 +++++++++++ src/client/cstrike/player.c | 2 +- src/client/entry.c | 81 +++--- src/client/npc.c | 4 +- src/client/valve/player.c | 2 +- src/gs-entbase/client.src | 1 + src/gs-entbase/client/baseentity.cpp | 2 +- src/gs-entbase/client/baseentity.h | 2 +- src/gs-entbase/client/env_laser.cpp | 4 +- src/gs-entbase/client/env_sprite.cpp | 4 +- src/gs-entbase/client/light_dynamic.cpp | 105 ++++++++ src/gs-entbase/client/point_message.cpp | 17 +- src/gs-entbase/decals.h | 2 +- src/gs-entbase/server.src | 1 + src/gs-entbase/server/light.cpp | 10 +- src/gs-entbase/server/light_dynamic.cpp | 251 ++++++++++++++++++ src/gs-entbase/shared/decals.cpp | 4 +- src/shared/entities.h | 1 + 19 files changed, 579 insertions(+), 63 deletions(-) create mode 100644 platform/test_maps.pk3dir/maps/test_dlights.bsp create mode 100644 platform/test_maps.pk3dir/maps/test_dlights.map create mode 100644 src/gs-entbase/client/light_dynamic.cpp create mode 100644 src/gs-entbase/server/light_dynamic.cpp diff --git a/platform/test_maps.pk3dir/maps/test_dlights.bsp b/platform/test_maps.pk3dir/maps/test_dlights.bsp new file mode 100644 index 0000000000000000000000000000000000000000..5d4761bc798dadd612d01bbb27cb39ae76ffdd5f GIT binary patch literal 1588312 zcmeI&&2wGnT?g=+G=yLR1X>_Kp{l1ap_4SWNkU2s)uh05*&)ny(;1`Kimj$a&NL=K2QAUyga}2 zJHO|1UL;-RH(z@Biw{jElkdFn^>0?cSvwCOu6}MZ`SK%^$rIIo|Ix|h z4}P?kHU9LEO(tKfz4^Jk)Q_C;^$Yio!$36Yw$z=KylgZnkd9vG|W!fM8 z;$(6?IiJhcleK(u^4VJZNNs&qvCd|A5`D!mv?IUa`ju)E2L|g*E{mOy1lzw0oygUUwy6mGoxOmO}a(yVYd6Zb=ws`j8AJk+vD+yPirx4zAa{2@vXKlF5A_H z@&5R3->8luW}3C5{OkSoX~(bE^=ao$++nuI^|kmu_hH-aW4id!dAoe0s#Vy{Xvh_js8}x=lw8lx&O!U z8Jkv5{H&Ja_{2V3eTdJFzP0#i+fmC8RUd_nM&<*vT1=~_CH9eSZIr*ZXVt%6Cv5fi zA>AVJ$-h|7tdE~{QAc0uRocZb)|B`RwD{DL{%G~IA^&`HsApE&-Ld`t#2@pi?e#i% zTFca*Huik1wvWYEOyU#Q;-}f@Ti%07lVe(I@!de}oK{aAss9J7r;Y1>ag;yDj_XN$ z@(=NSJ+s=;>Pf!V9TFc*d&T3`aZOp$UezBfe?aO=CkX$Jc?_RLQoxxVc= zn^bJ#TWpro>h%A5;`z~RRIA~xwR*bv+A|+L`kMH~dXm3+CUShPpRMij{h$1)zs2X+9MjszY9;wk zYjKbHTJ^KU|6Cvc@jm_+`emMeaFfp@QPdz#QdlmEF)oXQVEoNGKa<2cX@!|T{_PCzf?Al}X z^*=^=TFh)d+@0$`Yy9m|Os;D?SHd#)ywBS^@x>Z%c`}}wbDq4D|E159nA#k^HzX!= z|M%LTcTQTnCvvW|#ANRORx$tDAHNtgt?`^Ix&E<_S*)jqx|VmzKaKK?YfeDU_0Ki_ z-BC=Nd&bkAs-Aag4953QZ4U3~jODq{vzC}z4DX${YCZGH_4!~%hXD*pr z=9;fL7qpP%%fl_Vx@zRd5}`5k;(J->U;f4|OH>+`x2m*1sZ-2C_M%sFvK_e(x+$Y&mj zo6PFp=jyo6)b_8`_5)h`{d|)5=BT%PlggQVX-nm64#~HkY^%xF&3Ao8^L_KU-{D#O z%DHPJyEx|ap7oZmuWuFky6aK-(w53swWYrC^<668Xuh*I=GWuGXCHk34fkFqbCO@> z%=OK^oW6>DnQwBXEuF9T%Y2v4SGn5#()^w{&99$Fck+Anb=14(ccH$e^OfD$Zx#8* z*LUfB{d}jhvRtozhUd3tH2;ipWH)|(Gv8@)ts-CV*X5fnSzpa{z2!@;RphIjxgO0g z-#bqG{xPXG&3(A&*Vi}XtNND8S98sLyL{{O`7WKW%{Td~FOzTmrK9iX(?6M;eDk#D z_l?O>TkuQ1^<0beUt3+ioG|&)maXrwYD>#})0WA1So2-X_lKwX<-Tie!7usZm)7RH zihSeiv24D~x69YxFU#a>_g^>P{(8K1ieDGo?!goMQePL--!H4kH}+d5Uz_jPZ`pk7 z3)kc8XYp(I;0b<1zVgdEauxZ;*JGJ{@k@POzW#n$CSQBry6choR?f$NwU(#+{?VQP zjrzLa*Xrx?RjyU!I~-r%s&Se6GT$Lz=DTFRHs5wVGT%qe>R0#HqF=inUB1+}f_$0p zkgswsQ(xvg=Rcd+$x?ZdK`*iCW zI$P^L%j&-uKj?_zT{;A{n)3O5`ig7nKR*~wcfv~EJI7nADSy{kaZP2^K0`cy&ZDh& z8fC22l)o#ixTZ2XwWfC%By&5J+A4aeNFA}Ro#1_3QlZ$4`kVnJ$-q2mYUviKaFcztCPfO zbv2#EDKk56HLmFseNC%-Kc%MiZ#?+gbu}Hc8rSqxU(@ja8RR-Gb?wgT)YbJyzNU?9 zdb+mXpKI5h>Xa`hKX(`UnpS)5?$-5t@6X+HD|b4qdQPqB*u50Y@wIz#05y)MskRxtz!5FkK+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*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*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+0D-ZmVH~(Jif?peFuugyg0RjXF5FkK+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*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*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&UAV7cs0RjXF5al z&Fzgln|qh{4>tA=PKmj?xp8p)#>T;w>wVyj-K(41b(T+FJb&(dCAhYEP+PC=?!L0I zcd2%bD|z+S&Xvor+&VbeZKVuHCv@THBs}Hl&Heq2YnkJhu5TS|u3f!TQ{K9=w!L-j z`oY@mt%K`pJG*Q92Y0qN*KTec9Bl6Ge5#V}?rmM$+NqgyX`Im2OY;Ui6Aqd*K+t#Y-RD zMQ;K}4@dt{&L5EM9`44AE4(cRm%YuaYx}t+ZrW^(k% xA2Z4BlT4l&J)vj5S^DoRlgY#Vt1` 0;) { pSeat = &g_seats[s]; - + View_CalcViewport(s, w, h); setproperty(VF_ACTIVESEAT, (float)s); @@ -205,7 +205,7 @@ CSQC_UpdateView(float w, float h, float focus) pSeat->m_vecPredictedVelocity = pl.velocity; pSeat->m_flPredictedFlags = pl.flags; - // Don't hide the player entity + /* Don't hide the player entity */ if (autocvar_cl_thirdperson == TRUE && pl.health) { setproperty(VF_VIEWENTITY, (float)0); } else { @@ -232,13 +232,13 @@ CSQC_UpdateView(float w, float h, float focus) } else { setsensitivityscaler(pl.viewzoom); } - + if (pl.viewzoom <= 0.0f) { setsensitivityscaler(1.0f); } pl.viewzoom = oldzoom; - + View_Stairsmooth(); if (pSeat->m_pWeaponFX) { @@ -385,32 +385,32 @@ CSQC_InputEvent(float fEventType, float fKey, float fCharacter, float fDeviceID) pSeat = &g_seats[s]; switch (fEventType) { - case IE_KEYDOWN: - break; - case IE_KEYUP: - break; - case IE_MOUSEABS: - mouse_pos[0] = fKey; - mouse_pos[1] = fCharacter; - break; - case IE_MOUSEDELTA: - mouse_pos[0] += fKey; - mouse_pos[1] += fCharacter; - - if (mouse_pos[0] < 0) { - mouse_pos[0] = 0; - } else if (mouse_pos[0] > video_res[0]) { - mouse_pos[0] = video_res[0]; - } - - if (mouse_pos[1] < 0) { - mouse_pos[1] = 0; - } else if (mouse_pos[1] > video_res[1]) { - mouse_pos[1] = video_res[1]; - } - break; - default: - return TRUE; + case IE_KEYDOWN: + break; + case IE_KEYUP: + break; + case IE_MOUSEABS: + mouse_pos[0] = fKey; + mouse_pos[1] = fCharacter; + break; + case IE_MOUSEDELTA: + mouse_pos[0] += fKey; + mouse_pos[1] += fCharacter; + + if (mouse_pos[0] < 0) { + mouse_pos[0] = 0; + } else if (mouse_pos[0] > video_res[0]) { + mouse_pos[0] = video_res[0]; + } + + if (mouse_pos[1] < 0) { + mouse_pos[1] = 0; + } else if (mouse_pos[1] > video_res[1]) { + mouse_pos[1] = video_res[1]; + } + break; + default: + return TRUE; } VGUI_Input(fEventType, fKey, fCharacter, fDeviceID); @@ -524,7 +524,7 @@ CSQC_Parse_Event(void) pos = getproperty(VF_ORIGIN); ang = getproperty(VF_ANGLES); } - + pSeat->m_vecCameraOrigin = pos; pSeat->m_vecCameraAngle = ang; g_iIntermission = TRUE; @@ -604,9 +604,9 @@ CSQC_ConsoleCommand(string sCMD) /* the engine will hide the p1 etc commands... which is fun... */ int s = (float)getproperty(VF_ACTIVESEAT); pSeat = &g_seats[s]; - + tokenize(sCMD); - + switch (argv(0)) { case "dev_sentence": static CBaseEntity foo; @@ -799,17 +799,17 @@ CSQC_Ent_Update(float new) if (new) { spawnfunc_CBaseEntity(); } - me.ReadEntity(readfloat()); + me.ReceiveEntity(readfloat()); break; case ENT_PLAYER: - Player_ReadEntity(new); + Player_ReceiveEntity(new); break; case ENT_SPRITE: env_sprite spr = (env_sprite)self; if (new) { spawnfunc_env_sprite(); } - spr.ReadEntity(readfloat()); + spr.ReceiveEntity(readfloat()); break; break; case ENT_SPRAY: @@ -821,12 +821,19 @@ CSQC_Ent_Update(float new) case ENT_AMBIENTSOUND: Sound_ParseLoopingEntity(self, new); break; + case ENT_DLIGHT: + light_dynamic dl = (light_dynamic)self; + if (new) { + spawnfunc_light_dynamic(); + } + dl.ReceiveEntity(readfloat()); + break; case ENT_ENVLASER: env_laser l = (env_laser)self; if (new) { spawnfunc_env_laser(); } - l.ReadEntity(readfloat()); + l.ReceiveEntity(readfloat()); break; default: if (Game_Entity_Update(t, new) == FALSE) { diff --git a/src/client/npc.c b/src/client/npc.c index d78c48c1..1a27d859 100644 --- a/src/client/npc.c +++ b/src/client/npc.c @@ -20,7 +20,7 @@ class CBaseNPC:CBaseEntity float frame_last; virtual float() predraw; - virtual void(float flChanged) ReadEntity; + virtual void(float flChanged) ReceiveEntity; }; float @@ -56,7 +56,7 @@ CBaseNPC::predraw(void) } void -CBaseNPC::ReadEntity(float fl) +CBaseNPC::ReceiveEntity(float fl) { if (fl & NPC_MODELINDEX) modelindex = readshort(); diff --git a/src/client/valve/player.c b/src/client/valve/player.c index 66cef8fc..79d9efa2 100644 --- a/src/client/valve/player.c +++ b/src/client/valve/player.c @@ -15,7 +15,7 @@ */ void -Player_ReadEntity(float new) +Player_ReceiveEntity(float new) { float fl; player pl = (player)self; diff --git a/src/gs-entbase/client.src b/src/gs-entbase/client.src index 8ce7ecc8..c6c6cc22 100644 --- a/src/gs-entbase/client.src +++ b/src/gs-entbase/client.src @@ -20,6 +20,7 @@ client/env_laser.cpp client/func_lod.cpp client/func_dustmotes.cpp client/light_environment.cpp +client/light_dynamic.cpp client/sky_camera.cpp client/info_notnull.cpp client/point_message.cpp diff --git a/src/gs-entbase/client/baseentity.cpp b/src/gs-entbase/client/baseentity.cpp index 5cad4fe6..fed51881 100644 --- a/src/gs-entbase/client/baseentity.cpp +++ b/src/gs-entbase/client/baseentity.cpp @@ -223,7 +223,7 @@ CBaseEntity::Sentence(string msg) m_flSentenceTime = time; } -void CBaseEntity::ReadEntity(float flChanged) +void CBaseEntity::ReceiveEntity(float flChanged) { if (flChanged & BASEFL_CHANGED_ORIGIN) { origin[0] = readcoord(); diff --git a/src/gs-entbase/client/baseentity.h b/src/gs-entbase/client/baseentity.h index d657bcd7..2c437745 100644 --- a/src/gs-entbase/client/baseentity.h +++ b/src/gs-entbase/client/baseentity.h @@ -38,7 +38,7 @@ class CBaseEntity virtual void(string, string) SpawnKey; virtual void(string) Sentence; virtual void(void) ProcessWordQue; - virtual void(float flChanged) ReadEntity; + virtual void(float flChanged) ReceiveEntity; virtual float(void) predraw; virtual void(void) postdraw; virtual void(void) customphysics; diff --git a/src/gs-entbase/client/env_laser.cpp b/src/gs-entbase/client/env_laser.cpp index 91b78867..d91d82fc 100644 --- a/src/gs-entbase/client/env_laser.cpp +++ b/src/gs-entbase/client/env_laser.cpp @@ -35,7 +35,7 @@ class env_laser virtual void(void) Init; virtual void(void) Initialized; - virtual void(float flChanged) ReadEntity; + virtual void(float flChanged) ReceiveEntity; virtual float(void) predraw; }; @@ -54,7 +54,7 @@ float env_laser::predraw(void) return PREDRAW_NEXT; } -void env_laser::ReadEntity(float flChanged) +void env_laser::ReceiveEntity(float flChanged) { if (flChanged & ENVLASER_CHANGED_ORIGIN) { origin[0] = readcoord(); diff --git a/src/gs-entbase/client/env_sprite.cpp b/src/gs-entbase/client/env_sprite.cpp index e6d07fc1..3c682e3a 100644 --- a/src/gs-entbase/client/env_sprite.cpp +++ b/src/gs-entbase/client/env_sprite.cpp @@ -22,7 +22,7 @@ class env_sprite:CBaseEntity virtual void(void) Init; virtual void(void) Initialized; - virtual void(float flChanged) ReadEntity; + virtual void(float flChanged) ReceiveEntity; virtual void(void) think; }; @@ -41,7 +41,7 @@ void env_sprite::think(void) nextthink = time + (1 / framerate); } -void env_sprite::ReadEntity(float flChanged) +void env_sprite::ReceiveEntity(float flChanged) { origin[0] = readcoord(); origin[1] = readcoord(); diff --git a/src/gs-entbase/client/light_dynamic.cpp b/src/gs-entbase/client/light_dynamic.cpp new file mode 100644 index 00000000..d811d676 --- /dev/null +++ b/src/gs-entbase/client/light_dynamic.cpp @@ -0,0 +1,105 @@ +/* + * 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/light_dynamic.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 light_dynamic +{ + 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) light_dynamic; + + virtual void(float) ReceiveEntity; + virtual float(void) predraw; +}; + +float +light_dynamic::predraw(void) +{ + if (!m_iState) { + return PREDRAW_NEXT; + } + + /* TODO: We need to handle the second cone light */ + dynamiclight_add(origin, m_flIntensity, m_vecLight, m_flStyle); + + addentity(this); + return PREDRAW_NEXT; +} + +void light_dynamic::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 = "light_dynamic"; + drawmask = MASK_ENGINE; +} + +void light_dynamic::light_dynamic(void) +{ +} diff --git a/src/gs-entbase/client/point_message.cpp b/src/gs-entbase/client/point_message.cpp index ec72ed02..833d307d 100644 --- a/src/gs-entbase/client/point_message.cpp +++ b/src/gs-entbase/client/point_message.cpp @@ -32,7 +32,8 @@ class point_message:CBaseEntity virtual void(string, string) SpawnKey; }; -void point_message::SpawnKey(string strField, string strKey) +void +point_message::SpawnKey(string strField, string strKey) { switch (strField) { case "radius": @@ -50,14 +51,16 @@ void point_message::SpawnKey(string strField, string strKey) } } -void point_message::point_message(void) +void +point_message::point_message(void) { m_flRadius = 512; m_strMessage = "No message"; Init(); } -int PointMessage_Visible(vector p1, vector p2, vector ang) +int +PointMessage_Visible(vector p1, vector p2, vector ang) { vector delta; float fov; @@ -75,18 +78,14 @@ int PointMessage_Visible(vector p1, vector p2, vector ang) return FALSE; } -void PointMessage_Draw(void) +void +PointMessage_Draw(void) { vector vecPlayer; -#ifdef WASTES - vecPlayer = viewClient.vecPlayerOrigin; - vecPlayer += [0, 0, getstatf(ST_VIEWHEIGHT)]; -#else int s = (float)getproperty(VF_ACTIVESEAT); pSeat = &g_seats[s]; vecPlayer = pSeat->m_vecPredictedOrigin; -#endif string msg; float distance; diff --git a/src/gs-entbase/decals.h b/src/gs-entbase/decals.h index c0e284c3..3fe20b39 100644 --- a/src/gs-entbase/decals.h +++ b/src/gs-entbase/decals.h @@ -22,7 +22,7 @@ class decal #ifdef SERVER virtual float(entity, float) SendEntity; #else - virtual void(void) ReadEntity; + virtual void(void) ReceiveEntity; virtual float() predraw; virtual void(void) BuildShader; #endif diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index 3677ad2d..3b9fb0d3 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -61,6 +61,7 @@ server/func_pendulum.cpp server/func_vehicle.cpp server/func_vehiclecontrols.cpp server/light.cpp +server/light_dynamic.cpp server/stubs.cpp server/infodecal.cpp server/player_weaponstrip.cpp diff --git a/src/gs-entbase/server/light.cpp b/src/gs-entbase/server/light.cpp index 48a4d027..fe09056a 100644 --- a/src/gs-entbase/server/light.cpp +++ b/src/gs-entbase/server/light.cpp @@ -66,7 +66,8 @@ class light:CBaseTrigger virtual void(string, string) SpawnKey; }; -void light::Trigger(entity act, int state) +void +light::Trigger(entity act, int state) { switch (state) { case TRIG_OFF: @@ -86,7 +87,8 @@ void light::Trigger(entity act, int state) } } -void light::Respawn(void) +void +light::Respawn(void) { if (spawnflags & 1) { lightstyle(m_flStyle, "a"); @@ -116,7 +118,8 @@ light::SpawnKey(string strKey, string strValue) } } -void light::light(void) +void +light::light(void) { m_strPattern = "m"; CBaseTrigger::CBaseTrigger(); @@ -129,4 +132,3 @@ void light::light(void) CLASSEXPORT(light_spot, light) CLASSEXPORT(light_environment, light) - diff --git a/src/gs-entbase/server/light_dynamic.cpp b/src/gs-entbase/server/light_dynamic.cpp new file mode 100644 index 00000000..f6f19001 --- /dev/null +++ b/src/gs-entbase/server/light_dynamic.cpp @@ -0,0 +1,251 @@ +/* + * 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 light_dynamic (1 0 0) (-8 -8 -8) (8 8 8) +"targetname" Name +"target" Name of an entity in the map that light will point at. +"_light" Color of the spotlight in RGB255 format. +"brightness" Intensity of the spotlight. +"_inner_cone" Angles of the inner spotlight beam. 0 = omnidirectional. +"_cone" Angles of the outer spotlight beam. 0 = omnidirectional. +"distance" Distance that light is allowed to cast, in inches. +"spotlight_radius" Radius of the resulting spotlight that's cast at a wall. +"style" Select one of the hard-coded lightstyles. + +Dynamic light entity. Can be parented to things, it even has some inputs that +may be interesting. +*/ + +/* this has to match gs-entbase/client/light_dynamic.cpp! */ +enumflags +{ + DLIGHTFL_CHANGED_ORIGIN, /* don't move these */ + DLIGHTFL_CHANGED_ANGLES, /* don't move these */ + 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 light_dynamic:CBaseTrigger +{ + 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) light_dynamic; + virtual void(entity, int) Trigger; + virtual void(void) Respawn; + virtual float(entity, float) SendEntity; + virtual void(string, string) SpawnKey; + virtual void(entity, string, string) Input; + virtual void(void) ParentUpdate; +}; + +void +light_dynamic::ParentUpdate(void) +{ + if (m_parent) { + entity p = find(world, ::targetname, m_parent); + + if (!p) { + return; + } + + SetOrigin(p.origin); + } +} + +void +light_dynamic::Trigger(entity act, int state) +{ + switch (state) { + case TRIG_OFF: + m_iState = 0; + break; + case TRIG_ON: + m_iState = 1; + break; + default: + m_iState = 1 - m_iState; + } + + SendFlags |= DLIGHTFL_CHANGED_STATE; +} + +void +light_dynamic::Respawn(void) +{ + SetSolid(SOLID_NOT); + SetOrigin(m_oldOrigin); + SetAngles(m_oldAngle); + m_iState = 1; + + SendFlags = 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; +} + +float +light_dynamic::SendEntity(entity ePVSEnt, float flFlags) +{ + WriteByte(MSG_ENTITY, ENT_DLIGHT); + WriteFloat(MSG_ENTITY, flFlags); + + if (flFlags & DLIGHTFL_CHANGED_ORIGIN) { + WriteCoord(MSG_ENTITY, origin[0]); + WriteCoord(MSG_ENTITY, origin[1]); + WriteCoord(MSG_ENTITY, origin[2]); + } + + if (flFlags & DLIGHTFL_CHANGED_ANGLES) { + WriteCoord(MSG_ENTITY, angles[0]); + WriteCoord(MSG_ENTITY, angles[1]); + WriteCoord(MSG_ENTITY, angles[2]); + } + + if (flFlags & DLIGHTFL_CHANGED_LIGHT) { + WriteByte(MSG_ENTITY, m_vecLight[0]); + WriteByte(MSG_ENTITY, m_vecLight[1]); + WriteByte(MSG_ENTITY, m_vecLight[2]); + } + + if (flFlags & DLIGHTFL_CHANGED_INTENSITY) + WriteFloat(MSG_ENTITY, m_flIntensity); + if (flFlags & DLIGHTFL_CHANGED_INNERCONE) + WriteFloat(MSG_ENTITY, m_flInnerCone); + if (flFlags & DLIGHTFL_CHANGED_CONE) + WriteFloat(MSG_ENTITY, m_flCone); + if (flFlags & DLIGHTFL_CHANGED_DISTANCE) + WriteFloat(MSG_ENTITY, m_flDistance); + if (flFlags & DLIGHTFL_CHANGED_RADIUS) + WriteFloat(MSG_ENTITY, m_flRadius); + if (flFlags & DLIGHTFL_CHANGED_STYLE) + WriteByte(MSG_ENTITY, m_flStyle); + if (flFlags & DLIGHTFL_CHANGED_STATE) + WriteByte(MSG_ENTITY, m_iState); + + return TRUE; +} + +void +light_dynamic::Input(entity eAct, string strInput, string strData) +{ + switch (strInput) { + case "Color": + m_vecLight = stov(strData); + SendFlags |= DLIGHTFL_CHANGED_LIGHT; + break; + case "brightness": + m_flIntensity = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_INTENSITY; + break; + case "distance": + m_flDistance = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_DISTANCE; + break; + case "_inner_cone": + m_flInnerCone = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_INNERCONE; + break; + case "_cone": + m_flCone = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_CONE; + break; + case "spotlight_radius": + m_flRadius = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_RADIUS; + break; + case "style": + m_flStyle = stof(strData); + SendFlags |= DLIGHTFL_CHANGED_STYLE; + break; + case "TurnOn": + Trigger(eAct, TRIG_ON); + break; + case "TurnOff": + Trigger(eAct, TRIG_OFF); + break; + case "Toggle": + Trigger(eAct, TRIG_TOGGLE); + break; + default: + CBaseTrigger::Input(eAct, strInput, strData); + } +} + +void +light_dynamic::SpawnKey(string strKey, string strValue) +{ + switch (strKey) { + case "_light": + m_vecLight = stov(strValue); + break; + case "light": + case "brightness": + m_flIntensity = stof(strValue); + break; + case "_inner_cone": + m_flInnerCone = stof(strValue); + break; + case "_cone": + m_flCone = stof(strValue); + break; + case "distance": + m_flDistance = stof(strValue); + break; + case "spotlight_radius": + m_flRadius = stof(strValue); + break; + case "style": + m_flStyle = stof(strValue); + break; + default: + CBaseTrigger::SpawnKey(strKey, strValue); + } +} + +void +light_dynamic::light_dynamic(void) +{ + m_iState = 1; + m_vecLight = [255,255,255]; + CBaseTrigger::CBaseTrigger(); + gflags = GF_CANRESPAWN; + + /* FIXME: this is really bad, but FTE refuses to network things without a model + * or something along those lines - so we're force networking these right + * now. */ + pvsflags = PVSF_IGNOREPVS; +} + +CLASSEXPORT(dynamic_light, light_dynamic) diff --git a/src/gs-entbase/shared/decals.cpp b/src/gs-entbase/shared/decals.cpp index a253db78..4181f575 100644 --- a/src/gs-entbase/shared/decals.cpp +++ b/src/gs-entbase/shared/decals.cpp @@ -47,7 +47,7 @@ decal::SendEntity(entity pvsent, float changedflags) } #else void -decal::ReadEntity(void) +decal::ReceiveEntity(void) { origin[0] = readcoord(); origin[1] = readcoord(); @@ -238,6 +238,6 @@ void Decal_Parse(void) /* convert us to an object of type decal */ spawnfunc_decal(); new = (decal)self; - new.ReadEntity(); + new.ReceiveEntity(); } #endif diff --git a/src/shared/entities.h b/src/shared/entities.h index 53494e4f..a0636858 100644 --- a/src/shared/entities.h +++ b/src/shared/entities.h @@ -20,6 +20,7 @@ enum ENT_ENTITY = 1, ENT_PLAYER, ENT_AMBIENTSOUND, + ENT_DLIGHT, ENT_ENVLASER, ENT_SPRITE, ENT_SPRAY,