pRoxxx
Житель форума
Дата регистрации : Jan 2011
Проживает : UA DP
Сообщений : 360
Возраст: 33
Рейтинг
[кратко]
Пользователи:
1.7 (3 )
Нарушения:
-5.5 (? )
Сообщения:
-0.0 (Метки )
Регистрация:
8.5
[Кодинг] Создание env_fog.
Итак это мой первый тутор.
И первые эксперементы с OpenGL.
Клиентская часть:
Создаем наш хидер файл fog.h
в него вносим:
C++ Source Code:
Далее идем в hud.h и под
C++ Source Code:
int _cdecl MsgFunc_Concuss( const char *pszName, int iSize, void *pbuf );
Вставим:
C++ Source Code:
int _cdecl MsgFunc_Fog( const char *pszName, int iSize, void *pbuf );
Далее лезем в hud.cpp
инклудим
C++ Source Code:
спускаемся вниз и под
C++ Source Code:
1 int __MsgFunc_GameMode(const char *pszName, int iSize, void *pbuf )
3 return gHUD.MsgFunc_GameMode( pszName, iSize, pbuf );
вставляем:
C++ Source Code:
1 int __MsgFunc_Fog(const char *pszName, int iSize, void *pbuf )
3 return gHUD.MsgFunc_Fog( pszName, iSize, pbuf );
спускаемся до
C++ Source Code:
void CHud :: Init( void )
и вставляем в тело функции:
C++ Source Code:
Дальше в спускаемся в самый низ и в конце файла вставляем:
C++ Source Code:
2 int CHud::MsgFunc_Fog(const char *pszName, int iSize, void *pbuf)
4 BEGIN_READ( pbuf, iSize );
6 int mode = READ_BYTE();
10 Fog.density = READ_COORD();
11 Fog.startfog = READ_COORD();
12 Fog.endfog = READ_COORD();
13 Fog.red = (float )READ_BYTE() / 255.0;
14 Fog.green = (float )READ_BYTE() / 255.0;
15 Fog.blue = (float )READ_BYTE() / 255.0;
Переходим в tri.cpp
Инклудим:
C++ Source Code:
Идем к
C++ Source Code:
void DLLEXPORT HUD_DrawTransparentTriangles( void )
вставляем над функцией
C++ Source Code:
и в тело функции:
C++ Source Code:
1 if (Fog.m_Fog && Fog.startfog > 0.0 && Fog.endfog > 0.0)
3 float fogcolor[4]={Fog.red, Fog.green, Fog.blue, 1};
5 glFogf(GL_FOG_DENSITY, Fog.density);
6 glFogi(GL_FOG_MODE, GL_LINEAR);
7 glFogfv(GL_FOG_COLOR, fogcolor);
8 glFogf(GL_FOG_START, Fog.startfog);
9 glFogf(GL_FOG_END, Fog.endfog);
10 glHint(GL_FOG_HINT, GL_NICEST);
Далее идем в cldll_int.cpp
Иклудим:
C++ Source Code:
Спускаемся к функции:
C++ Source Code:
int DLLEXPORT HUD_VidInit( void )
Над функцией вставляем
C++ Source Code:
а в тело:
C++ Source Code:
На этом с клиентской частью покончено.
Серверная часть:
Лезим в player.h
в
C++ Source Code:
class CBasePlayer : public CBaseMonster
в самый конец вставляем
C++ Source Code:
Идем в cbase.h
и самом конце файла добавляем наш класс:
C++ Source Code:
1 class CFog : public CBaseEntity
6 void KeyValue( KeyValueData *pkvd );
8 static TYPEDESCRIPTION m_SaveData[];
13 int m_iRed, m_iGreen, m_iBlue;
Идем в triggers.cpp
под функцией
C++ Source Code:
void CRenderFxManager :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
вставляем:
C++ Source Code:
1 LINK_ENTITY_TO_CLASS( env_fog, CFog );
3 TYPEDESCRIPTION CFog::m_SaveData[] =
5 DEFINE_FIELD( CFog, m_fDensity, FIELD_FLOAT ),
6 DEFINE_FIELD( CFog, m_fStartFog, FIELD_FLOAT ),
7 DEFINE_FIELD( CFog, m_fEndFog, FIELD_FLOAT ),
8 DEFINE_FIELD( CFog, m_iRed, FIELD_INTEGER ),
9 DEFINE_FIELD( CFog, m_iGreen, FIELD_INTEGER ),
10 DEFINE_FIELD( CFog, m_iBlue, FIELD_INTEGER ),
13 void CFog :: KeyValue( KeyValueData *pkvd )
15 if (FStrEq(pkvd->szKeyName, "density" ))
17 m_fDensity = atof(pkvd->szValue);
18 pkvd->fHandled = TRUE;
20 else if (FStrEq(pkvd->szKeyName, "startfog" ))
22 m_fStartFog = atof(pkvd->szValue);
23 pkvd->fHandled = TRUE;
26 else if (FStrEq(pkvd->szKeyName, "endfog" ))
28 m_fEndFog = atof(pkvd->szValue);
29 pkvd->fHandled = TRUE;
32 else if (FStrEq(pkvd->szKeyName, "redfog" ))
34 m_iRed = atoi(pkvd->szValue);
35 pkvd->fHandled = TRUE;
38 else if (FStrEq(pkvd->szKeyName, "greenfog" ))
40 m_iGreen = atoi(pkvd->szValue);
41 pkvd->fHandled = TRUE;
44 else if (FStrEq(pkvd->szKeyName, "bluefog" ))
46 m_iBlue = atoi(pkvd->szValue);
47 pkvd->fHandled = TRUE;
51 CBaseEntity::KeyValue( pkvd );
55 void CFog :: Spawn ( void )
57 pev->solid = SOLID_NOT;
Лезим в player.cpp
и под
C++ Source Code:
Вставляем:
C++ Source Code:
под
C++ Source Code:
gmsgStatusValue = REG_USER_MSG("StatusValue" , 3);
вставляем:
C++ Source Code:
gmsgFog = REG_USER_MSG("Fog" , 10);
Ищем :
C++ Source Code:
void CBasePlayer::Spawn( void )
В теле функции, сверху вставляем
C++ Source Code:
и над
C++ Source Code:
g_pGameRules-><img src="images/smilies/pp2.gif" border="0" alt="" >layerSpawn( this );
Вставляем
C++ Source Code:
1 while ( !FNullEnt( pFind ) )
3 if (pFind->v.spawnflags & 1)
5 CBaseEntity *pEnt = CBaseEntity::Instance( pFind );
6 CFog *pFog = (CFog *)pEnt;
8 FogDensity = pFog->m_fDensity;
9 StartFog = pFog->m_fStartFog;
10 EndFog = pFog->m_fEndFog;
11 RedFog = pFog->m_iRed;
12 GreenFog = pFog->m_iGreen;
13 BlueFog = pFog->m_iBlue;
15 //UTIL_ClientPrintAll(HUD_PRINTCENTER, UTIL_VarArgs( "%i ", gmsgFog));
17 pFind = FIND_ENTITY_BY_CLASSNAME( pFind, "env_fog" );
Далее ищем:
C++ Source Code:
void CBasePlayer :: UpdateClientData( void )
и под
C++ Source Code:
m_bitsDamageType &= DMG_TIMEBASED;
Вставляем:
C++ Source Code:
3 MESSAGE_BEGIN(MSG_ONE, gmsgFog, NULL, pev);
5 WRITE_COORD(FogDensity);
Добавляем в наш *.fgd файлик
code:
@PointClass size(-16 -16 -16, 16 16 16) color(100 100 0) = env_fog : "Fog Controls"
[
density(integer) : "Fog Density" : 1
startfog(integer) : "Start Fog" : 10
endfog(integer) : "End Fog" : 50
redfog(integer) : "Red" : 0
greenfog(integer) : "Green" : 0
bluefog(integer) : "Blue" : 0
]
Вроде всё.
Скрины:
Отредактировано pRoxxx 27-05-2011 в 13:55
Сообщить модератору | | IP: Записан
Сообщение: 78499