Привет всем, вот походу разработки мода, столкнулся с проблемой , как сделать чтоб двери не открывались когда нет света и рядом с ними был индикатор (красн. зел.) .Кто играл в АШ1 знают…
и так приступим:
Открываем hl.dsp
Идём в buttons.cpp
После:
#define SF_BUTTON_TOUCH_ONLY 256
ставим:
#define SF_DOORS_CAN_OPENED 512
Находим функцию CBaseButton::ButtonUse :
в ней пишем :
if ( FBitSet(pev→spawnflags, SF_DOORS_CAN_OPENED) )
{
CVAR_SET_FLOAT( "cl_canopen_door", 1 );
}
ок, далее: открываем doors.h
После дефанов (#define) , вставляем:
Код:
class CBaseDoor : public CBaseToggle
{
public:
void Spawn( void );
void Precache( void );
virtual void KeyValue( KeyValueData *pkvd );
virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
virtual void Blocked( CBaseEntity *pOther );
virtual int ObjectCaps( void )
{
if (pev->spawnflags & SF_ITEM_USE_ONLY)
return (CBaseToggle::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_IMPULSE_USE;
else
return (CBaseToggle::ObjectCaps() & ~FCAP_ACROSS_TRANSITION);
};
virtual int Save( CSave &save );
virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
virtual void SetToggleState( int state );
// used to selectivly override defaults
void EXPORT DoorTouch( CBaseEntity *pOther );
// local functions
int DoorActivate( );
void EXPORT DoorGoUp( void );
void EXPORT DoorGoDown( void );
void EXPORT DoorHitTop( void );
void EXPORT DoorHitBottom( void );
BYTE m_bHealthValue;// some doors are medi-kit doors, they give players health
BYTE m_bMoveSnd; // sound a door makes while moving
BYTE m_bStopSnd; // sound a door makes when it stops
locksound_t m_ls; // door lock sounds
BYTE m_bLockedSound; // ordinals from entity selection
BYTE m_bLockedSentence;
BYTE m_bUnlockedSound;
BYTE m_bUnlockedSentence;
};
идем в doors.cpp (не в doors.h !!! ):
удаляем от туда класс двери (похоже на то что мы ставили , точнее оно и есть).
находим функцию:
void CBaseDoor::DoorTouch( CBaseEntity *pOther ) , в её тело вставляем:
Код:
int i;
i = CVAR_GET_FLOAT("cl_canopen_door");
if (i == 1)
{
iCanOpened = true;
}
if (iCanOpened == false)
{
}
так.. вроде здесь всё.
Идем в game.cpp
добавляем к аналогичным строкам:
Код:
cvar_t cl_canopen_door = {"cl_canopen_door","0", FCVAR_SERVER | FCVAR_ARCHIVE };
с дверьми всё :) .
Индикатор:
создаём файл item_drpanel
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "effects.h"
#include "doors.h"
class CDRPanel : public CPointEntity
{
public:
void Spawn( void );
void Create( int color );
void Precache( void );
void EXPORT ThinkDoor( void );
private:
CSprite *m_pLight;
};
LINK_ENTITY_TO_CLASS( item_drpanel, CDRPanel);
void CDRPanel::Spawn()
{
Precache();
SetThink(ThinkDoor);
pev->nextthink = gpGlobals->time + 2;
SET_MODEL(ENT(pev),"models/special/panel.mdl");
// if (FBitSet(pev->spawnflags,SF_START_LIGHT))
Create(0);
}
void CDRPanel::Precache()
{
PRECACHE_MODEL("models/special/panel.mdl");
PRECACHE_MODEL("sprites/special/glow03.spr");
}
void CDRPanel::Create (int color)
{
if (color == 1)
{
m_pLight = CSprite::SpriteCreate("sprites/special/glow03.spr", pev→origin + Vector(0,0,5), FALSE );
m_pLight→SetTransparency( kRenderGlow, 0, 255, 0, 100,kRenderFxNone );
m_pLight→SetScale(0.25);
}
else if (color == 0)
{
m_pLight = CSprite::SpriteCreate("sprites/special/glow03.spr", pev→origin + Vector(0,0,5), FALSE );
m_pLight→SetTransparency( kRenderGlow, 255, 0, 0, 100,kRenderFxNone );
m_pLight→SetScale(0.25);
}
}
void CDRPanel::ThinkDoor()
{
int getfl;
getfl = CVAR_GET_FLOAT("cl_canopen_door");
if (getfl == 1)
{
m_pLight→SetTransparency( kRenderGlow, 0, 255, 0, 255,kRenderFxNone );
}
else
{
m_pLight→SetTransparency( kRenderGlow, 255, 0, 0, 255,kRenderFxNone );
}
pev->nextthink = gpGlobals->time + 0.5;
}
Далее в fgd:
в spawnflags у энтити func_button добавим:
512:"Врубить свет!":0
]
и добавим в конце fgd:
@PointClass size(-16 -16 -16, 16 16 16) = item_drpanel: "Door panel"
[
]
Вот и всё :) glow03.spr можно взять в папке sprites у valve.
Модельку - свою :)