2022-12-17 13:32:43 +01:00
|
|
|
/***
|
2013-08-30 13:34:05 -07:00
|
|
|
*
|
|
|
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
|
|
|
*
|
|
|
|
* This product contains software technology licensed from Id
|
|
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
|
|
* without written permission from Valve LLC.
|
|
|
|
*
|
|
|
|
****/
|
|
|
|
/*
|
|
|
|
|
|
|
|
===== lights.cpp ========================================================
|
|
|
|
|
|
|
|
spawn and think functions for editor-placed lights
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "extdll.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "cbase.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CLight : public CPointEntity
|
|
|
|
{
|
|
|
|
public:
|
2021-11-28 16:54:48 +01:00
|
|
|
bool KeyValue(KeyValueData* pkvd) override;
|
|
|
|
void Spawn() override;
|
|
|
|
void Use(CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value) override;
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
bool Save(CSave& save) override;
|
|
|
|
bool Restore(CRestore& restore) override;
|
|
|
|
|
|
|
|
static TYPEDESCRIPTION m_SaveData[];
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
private:
|
2021-11-28 16:54:48 +01:00
|
|
|
int m_iStyle;
|
|
|
|
int m_iszPattern;
|
2013-08-30 13:34:05 -07:00
|
|
|
};
|
2021-11-28 16:54:48 +01:00
|
|
|
LINK_ENTITY_TO_CLASS(light, CLight);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
TYPEDESCRIPTION CLight::m_SaveData[] =
|
|
|
|
{
|
|
|
|
DEFINE_FIELD(CLight, m_iStyle, FIELD_INTEGER),
|
|
|
|
DEFINE_FIELD(CLight, m_iszPattern, FIELD_STRING),
|
2013-08-30 13:34:05 -07:00
|
|
|
};
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
IMPLEMENT_SAVERESTORE(CLight, CPointEntity);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// Cache user-entity-field values until spawn is called.
|
|
|
|
//
|
2021-11-29 20:31:17 +01:00
|
|
|
bool CLight::KeyValue(KeyValueData* pkvd)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
if (FStrEq(pkvd->szKeyName, "style"))
|
|
|
|
{
|
|
|
|
m_iStyle = atoi(pkvd->szValue);
|
2021-11-28 15:32:26 +01:00
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
else if (FStrEq(pkvd->szKeyName, "pitch"))
|
|
|
|
{
|
|
|
|
pev->angles.x = atof(pkvd->szValue);
|
2021-11-28 15:32:26 +01:00
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
else if (FStrEq(pkvd->szKeyName, "pattern"))
|
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
m_iszPattern = ALLOC_STRING(pkvd->szValue);
|
2021-11-28 15:32:26 +01:00
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
2021-11-28 15:32:26 +01:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
return CPointEntity::KeyValue(pkvd);
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) LIGHT_START_OFF
|
|
|
|
Non-displayed light.
|
|
|
|
Default light value is 300
|
|
|
|
Default style is 0
|
|
|
|
If targeted, it will toggle between on or off.
|
|
|
|
*/
|
|
|
|
|
2021-11-29 20:31:17 +01:00
|
|
|
void CLight::Spawn()
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
if (FStringNull(pev->targetname))
|
2021-11-28 16:54:48 +01:00
|
|
|
{ // inert light
|
2013-08-30 13:34:05 -07:00
|
|
|
REMOVE_ENTITY(ENT(pev));
|
|
|
|
return;
|
|
|
|
}
|
2021-11-28 16:54:48 +01:00
|
|
|
|
2013-08-30 13:34:05 -07:00
|
|
|
if (m_iStyle >= 32)
|
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
// CHANGE_METHOD(ENT(pev), em_use, light_use);
|
2013-08-30 13:34:05 -07:00
|
|
|
if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF))
|
|
|
|
LIGHT_STYLE(m_iStyle, "a");
|
2021-11-28 15:32:26 +01:00
|
|
|
else if (!FStringNull(m_iszPattern))
|
2021-11-28 16:54:48 +01:00
|
|
|
LIGHT_STYLE(m_iStyle, (char*)STRING(m_iszPattern));
|
2013-08-30 13:34:05 -07:00
|
|
|
else
|
|
|
|
LIGHT_STYLE(m_iStyle, "m");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-11-29 20:31:17 +01:00
|
|
|
void CLight::Use(CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
if (m_iStyle >= 32)
|
|
|
|
{
|
2021-11-28 16:54:48 +01:00
|
|
|
if (!ShouldToggle(useType, !FBitSet(pev->spawnflags, SF_LIGHT_START_OFF)))
|
2013-08-30 13:34:05 -07:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (FBitSet(pev->spawnflags, SF_LIGHT_START_OFF))
|
|
|
|
{
|
2021-11-28 15:32:26 +01:00
|
|
|
if (!FStringNull(m_iszPattern))
|
2021-11-28 16:54:48 +01:00
|
|
|
LIGHT_STYLE(m_iStyle, (char*)STRING(m_iszPattern));
|
2013-08-30 13:34:05 -07:00
|
|
|
else
|
|
|
|
LIGHT_STYLE(m_iStyle, "m");
|
|
|
|
ClearBits(pev->spawnflags, SF_LIGHT_START_OFF);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
LIGHT_STYLE(m_iStyle, "a");
|
|
|
|
SetBits(pev->spawnflags, SF_LIGHT_START_OFF);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// shut up spawn functions for new spotlights
|
|
|
|
//
|
2021-11-28 16:54:48 +01:00
|
|
|
LINK_ENTITY_TO_CLASS(light_spot, CLight);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
class CEnvLight : public CLight
|
|
|
|
{
|
|
|
|
public:
|
2021-11-28 16:54:48 +01:00
|
|
|
bool KeyValue(KeyValueData* pkvd) override;
|
|
|
|
void Spawn() override;
|
2013-08-30 13:34:05 -07:00
|
|
|
};
|
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
LINK_ENTITY_TO_CLASS(light_environment, CEnvLight);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
bool CEnvLight::KeyValue(KeyValueData* pkvd)
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
if (FStrEq(pkvd->szKeyName, "_light"))
|
|
|
|
{
|
2021-11-28 22:31:14 +01:00
|
|
|
int r = 0, g = 0, b = 0, v = 0;
|
2013-08-30 13:34:05 -07:00
|
|
|
char szColor[64];
|
2021-11-28 22:31:14 +01:00
|
|
|
const int j = sscanf(pkvd->szValue, "%d %d %d %d\n", &r, &g, &b, &v);
|
2013-08-30 13:34:05 -07:00
|
|
|
if (j == 1)
|
|
|
|
{
|
|
|
|
g = b = r;
|
|
|
|
}
|
|
|
|
else if (j == 4)
|
|
|
|
{
|
|
|
|
r = r * (v / 255.0);
|
|
|
|
g = g * (v / 255.0);
|
|
|
|
b = b * (v / 255.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// simulate qrad direct, ambient,and gamma adjustments, as well as engine scaling
|
2021-11-28 16:54:48 +01:00
|
|
|
r = pow(r / 114.0, 0.6) * 264;
|
|
|
|
g = pow(g / 114.0, 0.6) * 264;
|
|
|
|
b = pow(b / 114.0, 0.6) * 264;
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
sprintf(szColor, "%d", r);
|
|
|
|
CVAR_SET_STRING("sv_skycolor_r", szColor);
|
|
|
|
sprintf(szColor, "%d", g);
|
|
|
|
CVAR_SET_STRING("sv_skycolor_g", szColor);
|
|
|
|
sprintf(szColor, "%d", b);
|
|
|
|
CVAR_SET_STRING("sv_skycolor_b", szColor);
|
2021-11-28 15:32:26 +01:00
|
|
|
|
|
|
|
return true;
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
2021-11-28 15:32:26 +01:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
return CLight::KeyValue(pkvd);
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-11-29 20:31:17 +01:00
|
|
|
void CEnvLight::Spawn()
|
2013-08-30 13:34:05 -07:00
|
|
|
{
|
|
|
|
char szVector[64];
|
2021-11-28 16:54:48 +01:00
|
|
|
UTIL_MakeAimVectors(pev->angles);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
sprintf(szVector, "%f", gpGlobals->v_forward.x);
|
|
|
|
CVAR_SET_STRING("sv_skyvec_x", szVector);
|
|
|
|
sprintf(szVector, "%f", gpGlobals->v_forward.y);
|
|
|
|
CVAR_SET_STRING("sv_skyvec_y", szVector);
|
|
|
|
sprintf(szVector, "%f", gpGlobals->v_forward.z);
|
|
|
|
CVAR_SET_STRING("sv_skyvec_z", szVector);
|
2013-08-30 13:34:05 -07:00
|
|
|
|
2021-11-28 16:54:48 +01:00
|
|
|
CLight::Spawn();
|
2013-08-30 13:34:05 -07:00
|
|
|
}
|