From e3f1bf35166d651601a2e716561454b10ff44011 Mon Sep 17 00:00:00 2001 From: SmileyAG Date: Wed, 6 Apr 2022 06:01:04 +0400 Subject: [PATCH 1/4] Added item_generic for Opposing Force --- dlls/genericitem.cpp | 126 ++++++++++++++++++++++++++ linux/Makefile.agdll | 5 +- projects/vs2019/agdll.vcxproj | 1 + projects/vs2019/agdll.vcxproj.filters | 3 + 4 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 dlls/genericitem.cpp diff --git a/dlls/genericitem.cpp b/dlls/genericitem.cpp new file mode 100644 index 00000000..95fa15b8 --- /dev/null +++ b/dlls/genericitem.cpp @@ -0,0 +1,126 @@ +/*** +* +* 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. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +#include "extdll.h" +#include "util.h" +#include "cbase.h" + +const auto SF_ITEMGENERIC_DROP_TO_FLOOR = 1 << 0; + +class CGenericItem : public CBaseAnimating +{ +public: + void KeyValue(KeyValueData* pkvd) override; + void Precache() override; + void Spawn() override; + + void EXPORT StartItem(); + void EXPORT AnimateThink(); + + void Use(CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value) override; + + float m_lastTime; + int m_iSequence; +}; + +LINK_ENTITY_TO_CLASS(item_generic, CGenericItem); + +void CGenericItem::KeyValue(KeyValueData* pkvd) +{ + if (FStrEq("sequencename", pkvd->szKeyName)) + { + m_iSequence = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = true; + } + else if (FStrEq("skin", pkvd->szKeyName)) + { + pev->skin = static_cast(atof(pkvd->szValue)); + pkvd->fHandled = true; + } + else if (FStrEq("body", pkvd->szKeyName)) + { + pev->body = atoi(pkvd->szValue); + pkvd->fHandled = true; + } + else + { + CBaseDelay::KeyValue(pkvd); + } +} + +void CGenericItem::Precache() +{ + PRECACHE_MODEL(const_cast(STRING(pev->model))); +} + +void CGenericItem::Spawn() +{ + pev->solid = 0; + pev->movetype = 0; + pev->effects = 0; + pev->frame = 0; + + Precache(); + + SET_MODEL(edict(), STRING(pev->model)); + + if (m_iSequence) + { + SetThink(&CGenericItem::StartItem); + pev->nextthink = gpGlobals->time + 0.1; + } + + if (pev->spawnflags & SF_ITEMGENERIC_DROP_TO_FLOOR) + { + if (!g_engfuncs.pfnDropToFloor(pev->pContainingEntity)) + { + ALERT(at_error, "Item %s fell out of level at %f,%f,%f", STRING(pev->classname), pev->origin.x, pev->origin.y, pev->origin.z); + UTIL_Remove(this); + } + } +} + +void CGenericItem::StartItem() +{ + pev->effects = 0; + + pev->sequence = LookupSequence(STRING(m_iSequence)); + pev->frame = 0; + ResetSequenceInfo(); + + SetThink(&CGenericItem::AnimateThink); + pev->nextthink = gpGlobals->time + 0.1; + pev->frame = 0; +} + +void CGenericItem::AnimateThink() +{ + DispatchAnimEvents(); + StudioFrameAdvance(); + + if (m_fSequenceFinished && !m_fSequenceLoops) + { + pev->frame = 0; + ResetSequenceInfo(); + } + + pev->nextthink = gpGlobals->time + 0.1; + m_lastTime = gpGlobals->time; +} + +void CGenericItem::Use(CBaseEntity* pActivator, CBaseEntity* pCaller, USE_TYPE useType, float value) +{ + SetThink(&CGenericItem::SUB_Remove); + pev->nextthink = gpGlobals->time + 0.1; +} diff --git a/linux/Makefile.agdll b/linux/Makefile.agdll index 6f512140..d241c3c7 100644 --- a/linux/Makefile.agdll +++ b/linux/Makefile.agdll @@ -161,7 +161,8 @@ HLDLL_OBJS = \ $(HLDLL_OBJ_DIR)/agflood.o \ $(HLDLL_OBJ_DIR)/cvar.o \ $(HLDLL_OBJ_DIR)/agrandom.o \ - $(HLDLL_OBJ_DIR)/speedrunstats.o + $(HLDLL_OBJ_DIR)/speedrunstats.o \ + $(HLDLL_OBJ_DIR)/genericitem.o HLWPN_OBJS = \ $(HLWPN_OBJ_DIR)/hl_wpn_glock.o @@ -190,7 +191,7 @@ dirs: $(MODNAME).$(SHLIBEXT): $(HLDLL_OBJS) $(HLWPN_OBJS) $(PM_OBJS) $(GAME_SHARED_OBJS) $(MINISTL_OBJS) $(CC) $(LDFLAGS) $(SHLIBLDFLAGS) -o $(BUILD_DIR)/$@ $(HLDLL_OBJS) $(HLWPN_OBJS) $(PM_OBJS) $(GAME_SHARED_OBJS) ./gendbg.sh $(BUILD_DIR)/$(MODNAME).$(SHLIBEXT) - + $(HLWPN_OBJ_DIR)/%.o : $(HLWPN_SRC_DIR)/%.cpp $(DO_HLWPN_CC) diff --git a/projects/vs2019/agdll.vcxproj b/projects/vs2019/agdll.vcxproj index 714deb66..5ccd2298 100644 --- a/projects/vs2019/agdll.vcxproj +++ b/projects/vs2019/agdll.vcxproj @@ -257,6 +257,7 @@ + diff --git a/projects/vs2019/agdll.vcxproj.filters b/projects/vs2019/agdll.vcxproj.filters index e43c91fd..f4a7f9bc 100644 --- a/projects/vs2019/agdll.vcxproj.filters +++ b/projects/vs2019/agdll.vcxproj.filters @@ -447,6 +447,9 @@ Source Files\dlls + + Source Files\dlls + From 491c1235d1c307802c1ca67ac21fc8bd438f65df Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Thu, 21 Apr 2022 11:12:07 +0400 Subject: [PATCH 2/4] Add env_model from Spirit (Day of Defeat, PARANOIA, TWHL Tower, Echoes) --- dlls/effects.cpp | 180 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) diff --git a/dlls/effects.cpp b/dlls/effects.cpp index 295042b1..c4a17abd 100644 --- a/dlls/effects.cpp +++ b/dlls/effects.cpp @@ -1343,6 +1343,186 @@ void CSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy } } +//================================================================= +// env_model: like env_sprite, except you can specify a sequence. +//================================================================= +#define SF_ENVMODEL_OFF 1 +#define SF_ENVMODEL_DROPTOFLOOR 2 +#define SF_ENVMODEL_SOLID 4 + +class CEnvModel : public CBaseAnimating +{ + void Spawn( void ); + void Precache( void ); + void EXPORT Think( void ); + void KeyValue( KeyValueData *pkvd ); + void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); + virtual int ObjectCaps( void ) { return CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } + + virtual int Save( CSave &save ); + virtual int Restore( CRestore &restore ); + static TYPEDESCRIPTION m_SaveData[]; + + void SetSequence( void ); + + string_t m_iszSequence_On; + string_t m_iszSequence_Off; + int m_iAction_On; + int m_iAction_Off; +}; + +TYPEDESCRIPTION CEnvModel::m_SaveData[] = +{ + DEFINE_FIELD( CEnvModel, m_iszSequence_On, FIELD_STRING ), + DEFINE_FIELD( CEnvModel, m_iszSequence_Off, FIELD_STRING ), + DEFINE_FIELD( CEnvModel, m_iAction_On, FIELD_INTEGER ), + DEFINE_FIELD( CEnvModel, m_iAction_Off, FIELD_INTEGER ), +}; + +IMPLEMENT_SAVERESTORE( CEnvModel, CBaseAnimating ); +LINK_ENTITY_TO_CLASS( env_model, CEnvModel ); + +void CEnvModel::KeyValue( KeyValueData *pkvd ) +{ + if (FStrEq(pkvd->szKeyName, "m_iszSequence_On")) + { + m_iszSequence_On = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_iszSequence_Off")) + { + m_iszSequence_Off = ALLOC_STRING(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_iAction_On")) + { + m_iAction_On = atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else if (FStrEq(pkvd->szKeyName, "m_iAction_Off")) + { + m_iAction_Off = atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } + else + { + CBaseAnimating::KeyValue( pkvd ); + } +} + +void CEnvModel :: Spawn( void ) +{ + Precache(); + SET_MODEL( ENT(pev), STRING(pev->model) ); + UTIL_SetOrigin(pev, pev->origin); + + if (pev->spawnflags & SF_ENVMODEL_SOLID) + { + pev->solid = SOLID_SLIDEBOX; + UTIL_SetSize(pev, Vector(-10, -10, -10), Vector(10, 10, 10)); //LRCT + } + + if (pev->spawnflags & SF_ENVMODEL_DROPTOFLOOR) + { + pev->origin.z += 1; + DROP_TO_FLOOR ( ENT(pev) ); + } + SetBoneController( 0, 0 ); + SetBoneController( 1, 0 ); + + SetSequence(); + + pev->nextthink = gpGlobals->time + 0.1; +} + +void CEnvModel::Precache( void ) +{ + PRECACHE_MODEL( (char *)STRING(pev->model) ); +} + +void CEnvModel::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) +{ + if (ShouldToggle(useType, !(pev->spawnflags & SF_ENVMODEL_OFF))) + { + if (pev->spawnflags & SF_ENVMODEL_OFF) + pev->spawnflags &= ~SF_ENVMODEL_OFF; + else + pev->spawnflags |= SF_ENVMODEL_OFF; + + SetSequence(); + pev->nextthink = gpGlobals->time + 0.1; + } +} + +void CEnvModel::Think( void ) +{ + int iTemp; + + StudioFrameAdvance ( ); // set m_fSequenceFinished if necessary + + if (m_fSequenceFinished && !m_fSequenceLoops) + { + if (pev->spawnflags & SF_ENVMODEL_OFF) + iTemp = m_iAction_Off; + else + iTemp = m_iAction_On; + + switch (iTemp) + { + case 2: // change state + if (pev->spawnflags & SF_ENVMODEL_OFF) + pev->spawnflags &= ~SF_ENVMODEL_OFF; + else + pev->spawnflags |= SF_ENVMODEL_OFF; + SetSequence(); + break; + default: //remain frozen + return; + } + } + pev->nextthink = gpGlobals->time + 0.1; +} + +void CEnvModel :: SetSequence( void ) +{ + int iszSeq; + + if (pev->spawnflags & SF_ENVMODEL_OFF) + iszSeq = m_iszSequence_Off; + else + iszSeq = m_iszSequence_On; + + if (!iszSeq) + return; + pev->sequence = LookupSequence( STRING( iszSeq )); + + if (pev->sequence == -1) + { + if (pev->targetname) + ALERT( at_error, "env_model %s: unknown sequence \"%s\"\n", STRING( pev->targetname ), STRING( iszSeq )); + else + ALERT( at_error, "env_model: unknown sequence \"%s\"\n", STRING( pev->targetname ), STRING( iszSeq )); + pev->sequence = 0; + } + + pev->frame = 0; + ResetSequenceInfo( ); + + if (pev->spawnflags & SF_ENVMODEL_OFF) + { + if (m_iAction_Off == 1) + m_fSequenceLoops = 1; + else + m_fSequenceLoops = 0; + } + else + { + if (m_iAction_On == 1) + m_fSequenceLoops = 1; + else + m_fSequenceLoops = 0; + } +} class CGibShooter : public CBaseDelay { From 4d09d16049aa28ff1c80955a4ff6063a04f212cd Mon Sep 17 00:00:00 2001 From: SmileyAG <58108407+SmileyAG@users.noreply.github.com> Date: Sat, 23 Apr 2022 04:46:47 +0400 Subject: [PATCH 3/4] Added spawnflag from CZDS to make item_generic solid, based on mins/maxs --- dlls/genericitem.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dlls/genericitem.cpp b/dlls/genericitem.cpp index 95fa15b8..6613becb 100644 --- a/dlls/genericitem.cpp +++ b/dlls/genericitem.cpp @@ -17,6 +17,7 @@ #include "cbase.h" const auto SF_ITEMGENERIC_DROP_TO_FLOOR = 1 << 0; +const auto SF_ITEMGENERIC_SOLID = 1 << 1; class CGenericItem : public CBaseAnimating { @@ -89,6 +90,26 @@ void CGenericItem::Spawn() UTIL_Remove(this); } } + + if (pev->spawnflags & SF_ITEMGENERIC_SOLID) + { + Vector mins, maxs; + + pev->solid = SOLID_SLIDEBOX; + int sequence = LookupSequence(STRING(m_iSequence)); + + if (sequence == -1) + { + ALERT(at_console, "ERROR! FIX ME: item generic: %s, model: %s, does not have animation: %s\n", STRING(pev->targetname), STRING(pev->model), STRING(m_iSequence)); + + sequence = 0; + } + + ExtractBbox(sequence, mins, maxs); + + UTIL_SetSize(pev, mins, maxs); + UTIL_SetOrigin(pev, pev->origin); + } } void CGenericItem::StartItem() From 6637b27a2cd48e739c04be79159393cd6e3b9545 Mon Sep 17 00:00:00 2001 From: SmileyAG Date: Fri, 27 May 2022 05:29:25 +0400 Subject: [PATCH 4/4] Revert env_model entity, since changes been splitted to several requests --- dlls/effects.cpp | 180 ----------------------------------------------- 1 file changed, 180 deletions(-) diff --git a/dlls/effects.cpp b/dlls/effects.cpp index c4a17abd..295042b1 100644 --- a/dlls/effects.cpp +++ b/dlls/effects.cpp @@ -1343,186 +1343,6 @@ void CSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy } } -//================================================================= -// env_model: like env_sprite, except you can specify a sequence. -//================================================================= -#define SF_ENVMODEL_OFF 1 -#define SF_ENVMODEL_DROPTOFLOOR 2 -#define SF_ENVMODEL_SOLID 4 - -class CEnvModel : public CBaseAnimating -{ - void Spawn( void ); - void Precache( void ); - void EXPORT Think( void ); - void KeyValue( KeyValueData *pkvd ); - void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); - virtual int ObjectCaps( void ) { return CBaseEntity :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } - - virtual int Save( CSave &save ); - virtual int Restore( CRestore &restore ); - static TYPEDESCRIPTION m_SaveData[]; - - void SetSequence( void ); - - string_t m_iszSequence_On; - string_t m_iszSequence_Off; - int m_iAction_On; - int m_iAction_Off; -}; - -TYPEDESCRIPTION CEnvModel::m_SaveData[] = -{ - DEFINE_FIELD( CEnvModel, m_iszSequence_On, FIELD_STRING ), - DEFINE_FIELD( CEnvModel, m_iszSequence_Off, FIELD_STRING ), - DEFINE_FIELD( CEnvModel, m_iAction_On, FIELD_INTEGER ), - DEFINE_FIELD( CEnvModel, m_iAction_Off, FIELD_INTEGER ), -}; - -IMPLEMENT_SAVERESTORE( CEnvModel, CBaseAnimating ); -LINK_ENTITY_TO_CLASS( env_model, CEnvModel ); - -void CEnvModel::KeyValue( KeyValueData *pkvd ) -{ - if (FStrEq(pkvd->szKeyName, "m_iszSequence_On")) - { - m_iszSequence_On = ALLOC_STRING(pkvd->szValue); - pkvd->fHandled = TRUE; - } - else if (FStrEq(pkvd->szKeyName, "m_iszSequence_Off")) - { - m_iszSequence_Off = ALLOC_STRING(pkvd->szValue); - pkvd->fHandled = TRUE; - } - else if (FStrEq(pkvd->szKeyName, "m_iAction_On")) - { - m_iAction_On = atoi(pkvd->szValue); - pkvd->fHandled = TRUE; - } - else if (FStrEq(pkvd->szKeyName, "m_iAction_Off")) - { - m_iAction_Off = atoi(pkvd->szValue); - pkvd->fHandled = TRUE; - } - else - { - CBaseAnimating::KeyValue( pkvd ); - } -} - -void CEnvModel :: Spawn( void ) -{ - Precache(); - SET_MODEL( ENT(pev), STRING(pev->model) ); - UTIL_SetOrigin(pev, pev->origin); - - if (pev->spawnflags & SF_ENVMODEL_SOLID) - { - pev->solid = SOLID_SLIDEBOX; - UTIL_SetSize(pev, Vector(-10, -10, -10), Vector(10, 10, 10)); //LRCT - } - - if (pev->spawnflags & SF_ENVMODEL_DROPTOFLOOR) - { - pev->origin.z += 1; - DROP_TO_FLOOR ( ENT(pev) ); - } - SetBoneController( 0, 0 ); - SetBoneController( 1, 0 ); - - SetSequence(); - - pev->nextthink = gpGlobals->time + 0.1; -} - -void CEnvModel::Precache( void ) -{ - PRECACHE_MODEL( (char *)STRING(pev->model) ); -} - -void CEnvModel::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) -{ - if (ShouldToggle(useType, !(pev->spawnflags & SF_ENVMODEL_OFF))) - { - if (pev->spawnflags & SF_ENVMODEL_OFF) - pev->spawnflags &= ~SF_ENVMODEL_OFF; - else - pev->spawnflags |= SF_ENVMODEL_OFF; - - SetSequence(); - pev->nextthink = gpGlobals->time + 0.1; - } -} - -void CEnvModel::Think( void ) -{ - int iTemp; - - StudioFrameAdvance ( ); // set m_fSequenceFinished if necessary - - if (m_fSequenceFinished && !m_fSequenceLoops) - { - if (pev->spawnflags & SF_ENVMODEL_OFF) - iTemp = m_iAction_Off; - else - iTemp = m_iAction_On; - - switch (iTemp) - { - case 2: // change state - if (pev->spawnflags & SF_ENVMODEL_OFF) - pev->spawnflags &= ~SF_ENVMODEL_OFF; - else - pev->spawnflags |= SF_ENVMODEL_OFF; - SetSequence(); - break; - default: //remain frozen - return; - } - } - pev->nextthink = gpGlobals->time + 0.1; -} - -void CEnvModel :: SetSequence( void ) -{ - int iszSeq; - - if (pev->spawnflags & SF_ENVMODEL_OFF) - iszSeq = m_iszSequence_Off; - else - iszSeq = m_iszSequence_On; - - if (!iszSeq) - return; - pev->sequence = LookupSequence( STRING( iszSeq )); - - if (pev->sequence == -1) - { - if (pev->targetname) - ALERT( at_error, "env_model %s: unknown sequence \"%s\"\n", STRING( pev->targetname ), STRING( iszSeq )); - else - ALERT( at_error, "env_model: unknown sequence \"%s\"\n", STRING( pev->targetname ), STRING( iszSeq )); - pev->sequence = 0; - } - - pev->frame = 0; - ResetSequenceInfo( ); - - if (pev->spawnflags & SF_ENVMODEL_OFF) - { - if (m_iAction_Off == 1) - m_fSequenceLoops = 1; - else - m_fSequenceLoops = 0; - } - else - { - if (m_iAction_On == 1) - m_fSequenceLoops = 1; - else - m_fSequenceLoops = 0; - } -} class CGibShooter : public CBaseDelay {