client-side gs-entbase updates for TW.

This commit is contained in:
Marco Cawthorne 2019-10-08 22:14:18 +02:00
parent 32b7791b2b
commit ed5bf4acf3
10 changed files with 500 additions and 58 deletions

View file

@ -4,9 +4,14 @@ client/baseentity.cpp
client/env_cubemap.cpp
client/env_glow.cpp
client/env_sound.cpp
client/env_soundscape.cpp
client/env_particle.cpp
client/sky_camera.cpp
server/func_ladder.cpp
server/trigger_gravity.cpp
client/info_notnull.cpp
client/point_message.cpp
client/prop_dynamic.cpp
client/prop_rope.cpp
client/worldspawn.cpp
#endlist

View file

@ -93,7 +93,7 @@ CMap_Shoot(void)
strReflectcube,
tmp.m_iSize));
self.think = CMap_Check;
self.nextthink = time;
self.nextthink = time + 0.5f;
} else {
print("^2Cubemaps done...\n");
localcmd("mod_findcubemaps\nvid_reload\n");
@ -112,18 +112,9 @@ CMap_Check
void
CMap_Check(void)
{
if (whichpack(sprintf(
"textures/env/%s_%d_%d_%d.dds",
mapname,
g_vecCubePos[0],
g_vecCubePos[1],
g_vecCubePos[2])))
{
self.owner = find(self.owner, classname, "env_cubemap");
self.think = CMap_Shoot;
self.nextthink = time + 0.25f; /* because sigh */
}
self.nextthink = time;
self.owner = find(self.owner, classname, "env_cubemap");
self.think = CMap_Shoot;
self.nextthink = time + 0.25f; /* because sigh */
}
/*

View file

@ -40,21 +40,29 @@ class env_glow:CBaseEntity
float env_glow::predraw(void)
{
vector vecPlayer;
#ifdef WASTES
vecPlayer = viewClient.vecPlayerOrigin;
#else
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &seats[s];
vecPlayer = pSeat->vPlayerOrigin;
#endif
m_flAlpha = bound(0, m_flAlpha, 1.0f);
if (m_flAlpha > 0) {
vector forg;
vector fsize;
float falpha;
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &seats[s];
/* Scale the glow somewhat with the players distance */
fsize = m_vecSize * m_flScale;
fsize *= vlen(pSeat->vPlayerOrigin - origin) / 256;
fsize *= vlen(vecPlayer - origin) / 256;
/* Fade out when the player is starting to move away */
falpha = 1 - bound(0, vlen(pSeat->vPlayerOrigin - origin) / 1024, 1);
falpha = 1 - bound(0, vlen(vecPlayer - origin) / 1024, 1);
falpha *= m_flAlpha;
/* Clamp the alpha by the glows' renderamt value */
@ -62,7 +70,7 @@ float env_glow::predraw(void)
makevectors(view_angles);
/* Nudge this slightly towards the camera */
makevectors(vectoangles(origin - pSeat->vPlayerOrigin));
makevectors(vectoangles(origin - vecPlayer));
forg = origin + (v_forward * -16);
/* Project it, always facing the player */
@ -85,24 +93,31 @@ float env_glow::predraw(void)
void env_glow::customphysics(void)
{
vector vecPlayer;
#ifdef WASTES
vecPlayer = viewClient.vecPlayerOrigin;
#else
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &seats[s];
vecPlayer = pSeat->vPlayerOrigin;
#endif
if (checkpvs(pSeat->vPlayerOrigin, this) == FALSE) {
m_flAlpha -= frametime;
if (checkpvs(vecPlayer, this) == FALSE) {
m_flAlpha -= clframetime;
return;
}
other = world;
traceline(this.origin, pSeat->vPlayerOrigin, MOVE_OTHERONLY, this);
traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this);
/* If we can't trace against the player, or are two close, fade out */
if (trace_fraction < 1.0f || vlen(origin - pSeat->vPlayerOrigin) < 128) {
m_flAlpha -= frametime;
if (trace_fraction < 1.0f || vlen(origin - vecPlayer) < 128) {
m_flAlpha -= clframetime;
return;
}
m_flAlpha += frametime;
m_flAlpha += clframetime;
}
void env_glow::env_glow(void)
@ -111,32 +126,33 @@ void env_glow::env_glow(void)
m_flMaxAlpha = 1.0f;
m_vecColor = [1,1,1];
drawmask = MASK_ENGINE;
setorigin(this, origin);
Init();
}
void env_glow::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "shader":
m_strSprite = strKey;
precache_pic(m_strSprite);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
break;
case "model":
m_strSprite = sprintf("%s_0.tga", strKey);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
break;
case "scale":
m_flScale = stof(strKey);
break;
case "rendercolor":
case "rendercolour":
m_vecColor = stov(strKey) / 255;
break;
case "renderamt":
m_flMaxAlpha = stof(strKey) / 255;
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
case "shader":
m_strSprite = strKey;
precache_pic(m_strSprite);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
break;
case "model":
m_strSprite = sprintf("%s_0.tga", strKey);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
break;
case "scale":
m_flScale = stof(strKey);
break;
case "rendercolor":
case "rendercolour":
m_vecColor = stov(strKey) / 255;
break;
case "renderamt":
m_flMaxAlpha = stof(strKey) / 255;
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
}
}

View file

@ -0,0 +1,93 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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 env_particle (1 0 0) (-8 -8 -8) (8 8 8)
"message" Particle material to use.
"wait" Delay between emits.
"target" Name of target, like an info_notnull (client-side)
"velocity" Speed in units.
"count" Number of particles to emit.
Client-side particle effect. Active at runtime, fully client-side.
Cannot be triggered.
*/
class env_particle:CBaseEntity
{
entity m_eTarget;
float m_flNextTime;
float m_flPartID;
float m_flVelocity;
float m_flWait;
int m_iCount;
string m_strTarget;
void() env_particle;
virtual void() customphysics;
virtual void(string, string) SpawnKey;
};
void env_particle::customphysics(void)
{
if (checkpvs(viewClient.vecPlayerOrigin, this) == FALSE) {
return;
}
if (!m_flVelocity) {
m_flVelocity = 1.0f;
}
if (m_flNextTime > time) {
return;
}
if (m_strTarget) {
m_eTarget = find(world, ::targetname, m_strTarget);
makevectors(vectoangles(m_eTarget.origin - origin) * -1);
angles = v_forward;
}
pointparticles(m_flPartID, origin, angles * m_flVelocity, m_iCount);
m_flNextTime = time + m_flWait;
}
void env_particle::env_particle(void)
{
drawmask = MASK_ENGINE;
Init();
}
void env_particle::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "message":
m_flPartID = particleeffectnum(strKey);
break;
case "wait":
m_flWait = stof(strKey);
break;
case "target":
m_strTarget = strKey;
break;
case "velocity":
m_flVelocity = stof(strKey);
break;
case "count":
m_iCount = stoi(strKey);
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
}
}

View file

@ -148,21 +148,28 @@ class env_sound:CBaseEntity
void env_sound::customphysics(void)
{
vector vecPlayer;
#ifdef WASTES
vecPlayer = viewClient.vecPlayerOrigin;
#else
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &seats[s];
if (checkpvs(pSeat->vPlayerOrigin, this) == FALSE) {
vecPlayer = pSeat->vPlayerOrigin;
#endif
if (checkpvs(vecPlayer, this) == FALSE) {
return;
}
float fDist = vlen(pSeat->vPlayerOrigin - this.origin);
float fDist = vlen(vecPlayer - this.origin);
if (g_flDSPCheck > time) {
return;
}
other = world;
traceline(this.origin, pSeat->vPlayerOrigin, MOVE_OTHERONLY, this);
traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this);
if (trace_fraction < 1.0f) {
return;

View file

@ -0,0 +1,93 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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 env_soundscape (1 0 0) (-8 -8 -8) (8 8 8)
"radius" Radius in units.
"shader" Sound shader to play.
Client-side environmental soundscape modifier.
*/
int g_iSoundscape;
float g_flSoundscapeCheck;
int Sound_Precache(string shader);
class env_soundscape:CBaseEntity
{
int m_iShader;
int m_iRadius;
virtual void() customphysics;
virtual void(string, string) SpawnKey;
};
void env_soundscape::customphysics(void)
{
vector vecPlayer;
#ifdef WASTES
vecPlayer = viewClient.vecPlayerOrigin;
#else
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &seats[s];
vecPlayer = pSeat->vPlayerOrigin;
#endif
if (checkpvs(vecPlayer, this) == FALSE) {
return;
}
float fDist = vlen(vecPlayer - this.origin);
if (g_flSoundscapeCheck > time) {
return;
}
other = world;
traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this);
if (trace_fraction < 1.0f) {
return;
}
if (fDist <= m_iRadius) {
if (g_iSoundscape == m_iShader) {
return;
}
dprint(sprintf("[DSP] Soundscape changed to %i\n", m_iShader));
g_iSoundscape = m_iShader;
g_flSoundscapeCheck = time + 0.5;
}
}
void env_soundscape::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "shader":
m_iShader = Sound_Precache(strKey);
break;
case "radius":
m_iRadius = stoi(strKey);
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
}
}
void DSP_UpdateSoundscape(void)
{
}

View file

@ -0,0 +1,20 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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.
*/
class info_notnull:CBaseEntity
{
};

View file

@ -1,14 +1,22 @@
/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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 point_message (1 0 0) (-8 -8 -8) (8 8 8)
"message" The message to display.
"radius" The radius in which it will appear.
"message" The message to display.
"radius" The radius in which it will appear.
Client-side overlay/message that is projected in relation to its position
in 3D space.

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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 prop_dynamic (1 0 0) (-8 -8 -8) (8 8 8)
"model" Model file that will be displayed by the entity.
"modelscale" Scale modifier of the model. Default is '1'.
"angles" Sets the pitch, yaw and roll angles of the model.
"_cs" Toggles if the prop casts a shadow or not.
Client-side decorative model entity.
*/
class prop_dynamic:CBaseEntity {
virtual void() Init;
virtual void() PhysicsFrame;
/*virtual float() predraw;*/
virtual void(string, string) SpawnKey;
};
void prop_dynamic::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "modelscale":
scale = stof(strKey);
break;
case "angle":
angles[1] = stof(strKey);
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
}
}
/*float prop_dynamic::predraw(void)
{
if (checkpvs(viewClient.vecPlayerOrigin, this) == TRUE) {
addentity(this);
}
return PREDRAW_NEXT;
}*/
void prop_dynamic::Init(void)
{
CBaseEntity::Init();
precache_model(model);
setmodel(this, model);
setorigin(this, origin);
setsize(this, mins * scale, maxs * scale);
drawmask = MASK_ENGINE;
}
void prop_dynamic::PhysicsFrame(void)
{
//angles[1] += clframetime * 60;
}

View file

@ -0,0 +1,138 @@
/*
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
*
* 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.
*/
var int autocvar_rope_debug = FALSE;
class prop_rope:CBaseEntity
{
string m_strShader;
float m_flSag;
float m_flSwingFactor;
void() prop_rope;
virtual float() predraw;
virtual void(vector, vector) draw_segment;
virtual void(string, string) SpawnKey;
};
void prop_rope::draw_segment(vector start, vector end)
{
vector fsize = [3,3];
vector lit1 = /*[0.1,0.1,0.1] */ getlight(start) / 255;
vector lit2 = /*[0.1,0.1,0.1] */ getlight(end) / 255;
if (autocvar_rope_debug == TRUE) {
R_BeginPolygon("", 0, 0);
R_PolygonVertex(start, [0,1], lit1, 1);
R_PolygonVertex(end, [1,1], lit2, 1);
R_EndPolygon();
return;
}
makevectors(view_angles);
vector tex1, tex2, tex3, tex4;
vector eyepos = getproperty(VF_ORIGIN);
vector dir = normalize(start-end);
vector eyevector = normalize(start - eyepos);
vector tangent = crossproduct(dir, eyevector);
tex1 = start + tangent * fsize[0];
tex2 = start - tangent * fsize[1];
eyevector = normalize(end - eyepos);
tangent = crossproduct(dir, eyevector);
tex3 = end - tangent * fsize[0];
tex4 = end + tangent * fsize[1];
R_BeginPolygon(m_strShader, 0, 0);
R_PolygonVertex(tex1, [1,1], lit1, 1.0f);
R_PolygonVertex(tex2, [0,1], lit1, 1.0f);
R_PolygonVertex(tex3, [1,0], lit2, 1.0f);
R_PolygonVertex(tex4, [0,0], lit2, 1.0f);
R_EndPolygon();
}
float prop_rope::predraw(void)
{
vector pos1;
vector pos2;
float travel;
float segments;
if (checkpvs(getproperty(VF_ORIGIN), this) == FALSE) {
return;
}
pos1 = origin;
entity x = find(world, ::targetname, target);
if (!x) {
print("prop_rope without target.\n");
remove(this);
return PREDRAW_NEXT;
}
segments = 16;
travel = vlen(origin - x.origin) / segments;
float sc = 0;
for (float i = 0; i < segments; i++) {
float sag = cos(sc) * m_flSag - 1;
/* get the direction */
makevectors(vectoangles(x.origin - origin));
/* travel further and sag */
pos2 = pos1 + (v_forward * travel) + (v_up * -sag);
draw_segment(pos1, pos2);
pos1 = pos2;
sc += (M_PI * (1 / segments));
}
addentity(this);
return PREDRAW_NEXT;
}
void prop_rope::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "sag":
m_flSag = stof(strKey);
break;
case "shader":
m_strShader = strKey;
precache_pic(m_strShader);
break;
default:
CBaseEntity::SpawnKey(strField, strKey);
}
}
void prop_rope::prop_rope(void)
{
m_flSwingFactor = 1.0f;
m_flSag = 15.0f;
drawmask = MASK_ENGINE;
Init();
}