.:: Bots United ::.  
filebase forums irc server wiki web
cubebot epodbot fritzbot gravebot grogbot hpbbot ivpbot jkbotti joebot
meanmod podbotmm racc rcbot realbot sandbot shrikebot soulfathermaps waypoints yapb

Go Back   .:: Bots United ::. > Developer's Farm > General Bot Coding
General Bot Coding See what a pain it is to get those little mechs shooting around

Reply
 
Thread Tools
Re: code to get the illumination at any point on the map
Old
  (#11)
Immortal_BLG
Member
 
Status: Offline
Posts: 170
Join Date: Nov 2007
Location: Russian Federation
Default Re: code to get the illumination at any point on the map - 13-03-2012

You should add or in HLSDK, or somewhere in the header file of the bot of structures with a prefix "GL_".
Generally, for your bot it is necessary to add simply all code, from my fifth post and if it is concrete:
Code:
// "bot_globals.h"
//{
#include <com_model.h>	// WARNING: Probably it is necessary to add any additional includes....

struct GL_msurface_t
{
/*off=0(0)*/	int			visframe;		// should be drawn when node is crossed
/*off=4(1)*/	mplane_t	*plane;			// pointer to shared plane
/*off=8(2)*/	int			flags;			// see SURF_* #defines

/*off=12(3)*/	int			firstedge;	// look up in model->surfedges[], negative numbers are backwards edges
/*off=16(4)*/	int			numedges;

/*off=20(5)*/	short		texturemins[2]; // smallest s/t position on the surface.
/*off=24(6)*/	short		extents[2];		// ?? s/t texture size, 1..256 for all non-sky surfaces

/*off=28(7)*/	int			light_s, light_t;	// gl lightmap coordinates
/*off=36(9)*/	struct glpoly_t	*polys;				// multiple if warped
/*off=40(10)*/	msurface_t	*texturechain;
/*off=44(11)*/	mtexinfo_t	*texinfo;

// lighting info
/*off=48(12)*/	int			dlightframe;	// last frame the surface was checked by an animated light
/*off=52(13)*/	int			dlightbits;		// dynamically generated. Indicates if the surface illumination
								// is modified by an animated light.
/*off=56(14)*/	int			lightmaptexturenum;
/*off=60(15)*/	unsigned char		styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights
									  // no one surface can be effected by more than 4
									  // animated lights.

/*off=64(16)*/	int			cached_light[MAXLIGHTMAPS];	// values currently used in lightmap
/*off=80(20)*/	BOOL	cached_dlight;				// true if dynamic light in cache

/*off=84(21)*/	color24		*samples;	// [numstyles*surfsize]

/*off=88(22)*/	decal_t		*pdecals;
};	// sizeof (GL_msurface_t) == 92 (23)
struct GL_mnode_t
{
	enum ChildrenType_t
	{
		ChildrenType_Front,
		ChildrenType_Back,

		ChildrenType_Total
	};

// common with leaf
/*! Off=0(0)*/	int			contents;		// 0, to differentiate from leafs
/*! Off=4(1)*/	int			visframe;		// node needs to be traversed if current

/*! Off=8(2)*/	Vector		mins, maxs;		// for bounding box culling

/*! Off=32(8)*/	mnode_t	*parent;

// node specific
/*! Off=36(9)*/	mplane_t	*plane;
/*! Off=40(10)*/	mnode_t	*children[ChildrenType_Total];

/*! Off=48(12)*/	unsigned short		firstsurface;
/*! Off=50(12.5)*/	unsigned short		numsurfaces;
};	// sizeof (GL_mnode_t) == 52 (13)

#define	MAX_LIGHTSTYLES	64
#define	MAX_LIGHTSTYLEVALUE	256

struct lightstyle_t
{
	int  length;
	char map[MAX_LIGHTSTYLES];
};

extern lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
extern int          d_lightstylevalue[MAX_LIGHTSTYLEVALUE];	// 8.8 fraction of base light value
extern model_t     *sv_worldmodel;	// Analog of sv.worldmodel.

struct Color
{
	int red;
	int green;
	int blue;

	inline       void         Reset  (void)       { red = green = blue = 0; }
	inline const unsigned int GetAvg (void) const { return (red + green + blue) / (sizeof (Color) / sizeof (int)); }
};

/*
=============================================================================

LIGHT SAMPLING

=============================================================================
*/
namespace Light
{
//extern const mplane_t *lightplane (NULL);
//extern Vector lightspot;
extern Color g_pointColor;

template <typename nodeType, typename surfaceType> extern const bool RecursiveLightPoint (const nodeType *const node, const Vector &start, const Vector &end);

inline const bool IsSoftwareDrawingMode (void)
{
	static const bool isSoftwareDrawingMode (IS_DEDICATED_SERVER () || GetModuleHandle ("sw.dll") != NULL);

	return isSoftwareDrawingMode;
}
inline const bool ActualRecursiveLightPoint (const Math::Vector3D &start, const Math::Vector3D &end)
{
	return IsSoftwareDrawingMode () ?
		RecursiveLightPoint <mnode_t, msurface_t> (sv_worldmodel->nodes, start, end) :
		RecursiveLightPoint <GL_mnode_t, GL_msurface_t> (reinterpret_cast <GL_mnode_t *> (sv_worldmodel->nodes), start, end);
}

inline const unsigned char R_LightPoint (const Vector &p)
{
	// Reliability check.
	if (sv_worldmodel == NULL)
		return 0u;

	if (sv_worldmodel->lightdata == NULL)
		return 255u;

	Vector end (p);

	end.z -= 2048.0f;

	return ActualRecursiveLightPoint (p, end) == false ? 0u : static_cast <unsigned char> (g_pointColor.GetAvg ());
}
}
//}

// "bot_globals.cpp"
//{
lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
int          d_lightstylevalue[MAX_LIGHTSTYLEVALUE];	// 8.8 fraction of base light value
model_t     *sv_worldmodel (NULL);	// Analog of sv.worldmodel.
//}

// "dll.cpp"
//{
static inline const char *const FormatBuffer (const char *const format, ...)
{
	/// @todo REMOVE THIS SHIT

	static char string[4096u];

	va_list argumentPointer;

	// Concatenate all the arguments in one string....
	va_start (argumentPointer, format);
		vsnprintf (string, sizeof (string), format, argumentPointer);
	va_end (argumentPointer);

	return string;
}
inline void ShowMagic (void)
{
	/// @todo REMOVE THIS SHIT

	const edict_t *const hostPlayerEdict (INDEXENT (1u));

	if (hostPlayerEdict == NULL || hostPlayerEdict->free || (hostPlayerEdict->v.flags & FL_FAKECLIENT))
		return;

	CLIENT_PRINTF (hostPlayerEdict, print_chat, FormatBuffer ("ShowMagic(): \"%s\"->v.light_level=%i, R_LightPoint(hostOrg)=%i\n", STRING (hostPlayerEdict->v.netname), hostPlayerEdict->v.light_level, Light::R_LightPoint (hostPlayerEdict->v.origin)));
}

static inline void SetupLightStyles (void)
{
	// Setup lighting information....

	// reset all light styles
	for (unsigned char index (0u); index < MAX_LIGHTSTYLES; ++index)
	{
		cl_lightstyle.length = 0u;
		cl_lightstyle.map[0u] = '\0';
	}

	for (unsigned short index (0u); index < MAX_LIGHTSTYLEVALUE; ++index)
		d_lightstylevalue[index] = 264;	// normal light value
}

static inline void R_AnimateLight (void)
{
	// light animations
	// 'm' is normal light, 'a' is no light, 'z' is double bright
	const int i (static_cast <int> (gpGlobals->time * 10.0f));
	int k;

	for (unsigned char j (0u); j < MAX_LIGHTSTYLES; ++j)
	{
		if (cl_lightstyle[j].length == 0u)
		{
			d_lightstylevalue[j] = 256;

			continue;
		}

		k = cl_lightstyle[j].map[i % cl_lightstyle[j].length] - 'a';
		k *= 22;

		d_lightstylevalue[j] = k;
	}	
}

static inline void CallbackStartFrame (void)
{
	R_AnimateLight ();

	/// @todo REMOVE THIS SHIT
	{
	inline void ShowMagic (void);

	ShowMagic ();
	}
}
static inline void CallbackPM_Move (playermove_t *const playerMove, const bool server)
{
	// Reliability checks.
	assert (playerMove != NULL);
	assert (server == true);	// ALWAYS SHOULD BE TRUE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

	// Honestly this is need only once per changelevel, but....
	sv_worldmodel = playerMove->physents[0u].model;	// Always point at sv.worldmodel!

	// Reliability check.
	assert (sv_worldmodel != NULL);
}

/////////////////////////////////// BEGIN OF DLL API FORWARDS ///////////////////////////////////
WINAPI GiveFnptrsToDll (enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals)
{
	// get the engine functions from the engine...

	memcpy (&g_engfuncs, pengfuncsFromEngine, sizeof (enginefuncs_t));
	gpGlobals = pGlobals;

	SetupLightStyles ();
}
// Called each Server frame at the very beginning
void StartFrame (void)
{
	CallbackStartFrame ();

	/// ... PART OF YOUR CODE HERE

	RETURN_META (MRES_IGNORED);
}
static void PM_Move (playermove_t *playerMove, BOOL server)	// NEW FORWARD FOR YOUR BOT!!!
{
	// this is the player movement code clients run to predict things when the server can't update
	// them often enough (or doesn't want to). The server runs exactly the same function for
	// moving players. There is normally no distinction between them, else client-side prediction
	// wouldn't work properly (and it doesn't work that well, already...)

	CallbackPM_Move (playerMove, server == TRUE);

	RETURN_META (MRES_IGNORED);
}
/////////////////////////////////// END OF DLL API FORWARDS ///////////////////////////////////

C_DLLEXPORT int GetEntityAPI2 (DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion)
{
   gFunctionTable.pfnGameInit = GameDLLInit;
   gFunctionTable.pfnSpawn = Spawn;
   gFunctionTable.pfnClientConnect = ClientConnect;
   gFunctionTable.pfnClientDisconnect = ClientDisconnect;
   gFunctionTable.pfnClientPutInServer = ClientPutInServer;
   gFunctionTable.pfnClientCommand = ClientCommand;
   gFunctionTable.pfnServerActivate = ServerActivate;
   gFunctionTable.pfnServerDeactivate = ServerDeactivate;
   gFunctionTable.pfnStartFrame = StartFrame;
   gFunctionTable.pfnKeyValue = Pfn_KeyValue;                  // KWo - 06.03.2006
   gFunctionTable.pfnPM_Move = PM_Move;	// NEW FORWARD FOR YOUR BOT!!!
   gFunctionTable.pfnUpdateClientData = Pfn_UpdateClientData;  // KWo - 02.03.2010

   memcpy (pFunctionTable, &gFunctionTable, sizeof (DLL_FUNCTIONS));
   return (TRUE);
}
//}

// "engine.cpp"
//{
static inline void CallbackLightStyle (const unsigned char style, char *const value)
{
	if (style >= MAX_LIGHTSTYLES)
	{
		g_engfuncs.ServerPrintf ("SVC_LIGHTSTYLE > MAX_LIGHTSTYLES\n");

		return;
	}

	// OCCURS!
	if (value == NULL)
	{
		cl_lightstyle[style].length = 0u;
		cl_lightstyle[style].map[0u] = '\0';

		return;
	}

	const unsigned short maximumCopyAmount (sizeof (cl_lightstyle[style].map) - sizeof ('\0'));

	strncpy (cl_lightstyle[style].map, value, maximumCopyAmount);

	cl_lightstyle[style].map[maximumCopyAmount] = '\0';

	cl_lightstyle[style].length = strlen (cl_lightstyle[style].map);
}

/////////////////////////////////// BEGIN OF ENGINE API FORWARDS ///////////////////////////////////
static void pfnLightStyle (int style, char *value)	// NEW FORWARD FOR YOUR BOT!!!
{
	// Update light style for fake clients....
	CallbackLightStyle (static_cast <const unsigned char> (style), value);

	RETURN_META (MRES_IGNORED);
}

C_DLLEXPORT int GetEngineFunctions (enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion)
{
   meta_engfuncs.pfnChangeLevel = pfnChangeLevel;
   meta_engfuncs.pfnEmitSound = pfnEmitSound;
   meta_engfuncs.pfnFindEntityByString = pfnFindEntityByString;
   meta_engfuncs.pfnClientCommand = pfnClientCommand;
   meta_engfuncs.pfnLightStyle = pfnLightStyle;	// NEW FORWARD FOR YOUR BOT!!!
   meta_engfuncs.pfnMessageBegin = pfnMessageBegin;
   meta_engfuncs.pfnMessageEnd = pfnMessageEnd;
   meta_engfuncs.pfnWriteByte = pfnWriteByte;
   meta_engfuncs.pfnWriteChar = pfnWriteChar;
   meta_engfuncs.pfnWriteShort = pfnWriteShort;
   meta_engfuncs.pfnWriteLong = pfnWriteLong;
   meta_engfuncs.pfnWriteAngle = pfnWriteAngle;
   meta_engfuncs.pfnWriteCoord = pfnWriteCoord;
   meta_engfuncs.pfnWriteString = pfnWriteString;
   meta_engfuncs.pfnWriteEntity = pfnWriteEntity;
   meta_engfuncs.pfnClientPrintf = pfnClientPrintf;
   meta_engfuncs.pfnCmd_Args = pfnCmd_Args;
   meta_engfuncs.pfnCmd_Argv = pfnCmd_Argv;
   meta_engfuncs.pfnCmd_Argc = pfnCmd_Argc;
   meta_engfuncs.pfnSetClientMaxspeed = pfnSetClientMaxspeed;
   meta_engfuncs.pfnGetPlayerWONId = pfnGetPlayerWONId;
   meta_engfuncs.pfnGetPlayerAuthId = pfnGetPlayerAuthId;

   memcpy (pengfuncsFromEngine, &meta_engfuncs, sizeof (enginefuncs_t));
   return (TRUE);
}
/////////////////////////////////// END OF ENGINE API FORWARDS ///////////////////////////////////
//}

// "util.cpp"
//{
/*
=============================================================================

LIGHT SAMPLING

=============================================================================
*/
namespace Light
{
//const mplane_t *lightplane (NULL);
//Vector lightspot;
Color g_pointColor;

template <typename nodeType, typename surfaceType> const bool RecursiveLightPoint (const nodeType *const node, const Vector &start, const Vector &end)
{
	float front, back, frac;
	int side;
	mplane_t *plane;
	Vector mid;
	surfaceType *surf;
	int s, t, ds, dt;
	int i;
	mtexinfo_t *tex;
	color24 *lightmap;
	unsigned int scale;
	unsigned char maps;

	// Reliability check.
	assert (node != NULL);

	if (node->contents < 0)
		return false;	// didn't hit anything

	// Determine which side of the node plane our points are on
	// FIXME: optimize for axial
	plane = node->plane;
	front = (start | plane->normal) - plane->dist;
	back = (end | plane->normal) - plane->dist;
	side = front < 0.0f;

	// If they're both on the same side of the plane, don't bother to split just check the appropriate child
	if ((back < 0.0f) == side)
		return RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[side]), start, end);

	// calculate mid point
	frac = front / (front - back);
	mid = start + (end - start) * frac;

	// go down front side	
	if (RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[side]), start, mid))
		return true;	// hit something

	// Blow it off if it doesn't split the plane...
	if ((back < 0.0f) == side)
		return false;	// didn't hit anything

	// check for impact on this node
//	lightspot = mid;
//	lightplane = plane;

	surf = reinterpret_cast <surfaceType *> (sv_worldmodel->surfaces) + node->firstsurface;
	for (i = 0; i < node->numsurfaces; ++i, ++surf)
	{
		if (surf->flags & SURF_DRAWTILED)
			continue;	// no lightmaps

		tex = surf->texinfo;

		// See where in lightmap space our intersection point is
		s = static_cast <int> ((mid | Vector (tex->vecs[0])) + tex->vecs[0][3]);
		t = static_cast <int> ((mid | Vector (tex->vecs[1])) + tex->vecs[1][3]);

		// Not in the bounds of our lightmap? punt...
		if (s < surf->texturemins[0] || t < surf->texturemins[1])
			continue;

		// assuming a square lightmap (FIXME: which ain't always the case),
		// lets see if it lies in that rectangle. If not, punt...
		ds = s - surf->texturemins[0];
		dt = t - surf->texturemins[1];

		if (ds > surf->extents[0] || dt > surf->extents[1])
			continue;

		if (surf->samples == NULL)
			return true;

		ds >>= 4;
		dt >>= 4;

		g_pointColor.Reset ();	// Reset point color.

		const int smax ((surf->extents[0] >> 4) + 1);
		const int tmax ((surf->extents[1] >> 4) + 1);
		const int size (smax * tmax);

		lightmap = surf->samples + dt * smax + ds;

		// Compute the lightmap color at a particular point
		for (maps = 0u; maps < MAXLIGHTMAPS && surf->styles[maps] != 255u; ++maps)
		{
			scale = d_lightstylevalue[surf->styles[maps]];

			g_pointColor.red += lightmap->r * scale;
			g_pointColor.green += lightmap->g * scale;
			g_pointColor.blue += lightmap->b * scale;

			lightmap += size;	// skip to next lightmap
		}

		g_pointColor.red >>= 8u;
		g_pointColor.green >>= 8u;
		g_pointColor.blue >>= 8u;

		return true;
	}

	// go down back side
	return RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[!side]), mid, end);
}
}
//}
Well everything seems to be....
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#12)
KWo
Developer of PODBot mm
 
KWo's Avatar
 
Status: Offline
Posts: 3,415
Join Date: Apr 2004
Default Re: code to get the illumination at any point on the map - 15-03-2012

Quote:
Originally Posted by ERROR_LOG
>d:\tools\compile\mingw\proj\podbot\bot_globals.h( 442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>waypoint.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>util.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>engine.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>.\engine.cpp(592) : error C2039: 'ServerPrintf' : is not a member of 'enginefuncs_s'
1> ../hlsdk\multiplayer\engine\eiface.h(106) : see declaration of 'enginefuncs_s'
1>dll.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>.\dll.cpp(238 ) : error C3861: 'SetupLightStyles': identifier not found
1>.\dll.cpp(1902) : error C3861: 'CallbackStartFrame': identifier not found
1>.\dll.cpp(2368 ) : error C2065: 'playermove_t' : undeclared identifier
1>.\dll.cpp(2368 ) : error C2065: 'playerMove' : undeclared identifier
1>.\dll.cpp(2368 ) : error C2275: 'BOOL' : illegal use of this type as an expression
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\windef.h(153) : see declaration of 'BOOL'
1>.\dll.cpp(2368 ) : error C2146: syntax error : missing ')' before identifier 'server'
1>.\dll.cpp(2368 ) : error C2182: 'PM_Move' : illegal use of type 'void'
1>.\dll.cpp(2368 ) : error C2078: too many initializers
1>.\dll.cpp(2368 ) : error C2275: 'BOOL' : illegal use of this type as an expression
1> C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include\windef.h(153) : see declaration of 'BOOL'
1>.\dll.cpp(2368 ) : error C2059: syntax error : ')'
1>.\dll.cpp(2369) : error C2143: syntax error : missing ';' before '{'
1>.\dll.cpp(2369) : error C2447: '{' : missing function header (old-style formal list?)
1>.\dll.cpp(3708 ) : error C2664: 'void (edict_t *,PRINT_TYPE,const char *)' : cannot convert parameter 1 from 'const edict_t *const ' to 'edict_t *'
1> Conversion loses qualifiers
1>.\dll.cpp(3718 ) : error C2228: left of '.length' must have class/struct/union
1> type is 'lightstyle_t [64]'
1>.\dll.cpp(3719) : error C2228: left of '.map' must have class/struct/union
1> type is 'lightstyle_t [64]'
1>.\dll.cpp(3760) : error C2065: 'playermove_t' : undeclared identifier
1>.\dll.cpp(3760) : error C2059: syntax error : 'const'
1>.\dll.cpp(3761) : error C2143: syntax error : missing ';' before '{'
1>.\dll.cpp(3761) : error C2447: '{' : missing function header (old-style formal list?)
1>.\dll.cpp(3785) : error C2440: '=' : cannot convert from 'int' to 'void (__cdecl *)(playermove_s *,qboolean)'
1> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>bot_sounds.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>bot_navigate.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>bot_globals.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>bot_combat.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>bot_client.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>bot_chat.cpp
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2653: 'Math' : is not a class or namespace name
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (442) : error C2143: syntax error : missing ',' before '&'
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (445) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'start' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (446) : error C2065: 'end' : undeclared identifier
1>d:\tools\compile\mingw\proj\podbot\bot_globals.h (462) : error C2660: 'Light::ActualRecursiveLightPoint' : function does not take 2 arguments
1>Generating Code...
1>Build log was saved at "file://d:\TOOLS\Compile\MinGW\PROJ\podbot\Release\BuildLo g.htm"
1>PodBot_mm - 109 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
It would be much more easy if You could post a working code instead just examples...

[EDIT]
If You want to see my code - send me a pm with Your email address, I can send it You that way. I wanted to upload it at the mirror of the filebase (CFE server), but it looks like Ancient has changed some access rights and nobody can browse my files there.
[/EDIT]

Last edited by KWo; 15-03-2012 at 21:27..
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#13)
Immortal_BLG
Member
 
Status: Offline
Posts: 170
Join Date: Nov 2007
Location: Russian Federation
Default Re: code to get the illumination at any point on the map - 16-03-2012

Quote:
Originally Posted by KWo View Post
It would be much more easy if You could post a working code instead just examples... :)

[EDIT]
If You want to see my code - send me a pm with Your email address, I can send it You that way. I wanted to upload it at the mirror of the filebase (CFE server), but it looks like Ancient has changed some access rights and nobody can browse my files there. :(
[/EDIT]
Eventually I decided to compile the project podbot_mm (in MSVC 2010) yourself, pre-inserting my code in order to eliminate all errors at the building.
So KWo HERE you can take the project (the source code and DLL), and below I present the corrected code:
Code:
#include <com_model.h>
#include <pm_defs.h>

#define	SURF_PLANEBACK		2
#define	SURF_DRAWSKY		4
#define SURF_DRAWSPRITE		8
#define SURF_DRAWTURB		0x10
#define SURF_DRAWTILED		0x20
#define SURF_DRAWBACKGROUND	0x40

struct GL_msurface_t
{
#define SURF_UNDERWATER		0x80	// ONLY FOR OpenGL!!!
//#define SURF_DONTWARP		0x100	// ONLY FOR OpenGL!!! (EXISTS?!?!?!?!?!??!?!?!?!?!?!??!)

/*off=0(0)*/	int			visframe;		// should be drawn when node is crossed
/*off=4(1)*/	mplane_t	*plane;			// pointer to shared plane
/*off=8(2)*/	int			flags;			// see SURF_* #defines

/*off=12(3)*/	int			firstedge;	// look up in model->surfedges[], negative numbers are backwards edges
/*off=16(4)*/	int			numedges;

/*off=20(5)*/	short		texturemins[2]; // smallest s/t position on the surface.
/*off=24(6)*/	short		extents[2];		// ?? s/t texture size, 1..256 for all non-sky surfaces

/*off=28(7)*/	int			light_s, light_t;	// gl lightmap coordinates
/*off=36(9)*/	struct glpoly_t	*polys;				// multiple if warped
/*off=40(10)*/	msurface_t	*texturechain;
/*off=44(11)*/	mtexinfo_t	*texinfo;

// lighting info
/*off=48(12)*/	int			dlightframe;	// last frame the surface was checked by an animated light
/*off=52(13)*/	int			dlightbits;		// dynamically generated. Indicates if the surface illumination
								// is modified by an animated light.
/*off=56(14)*/	int			lightmaptexturenum;
/*off=60(15)*/	unsigned char		styles[MAXLIGHTMAPS]; // index into d_lightstylevalue[] for animated lights
									  // no one surface can be effected by more than 4
									  // animated lights.

/*off=64(16)*/	int			cached_light[MAXLIGHTMAPS];	// values currently used in lightmap
/*off=80(20)*/	qboolean	cached_dlight;				// true if dynamic light in cache

/*off=84(21)*/	color24		*samples;	// [numstyles*surfsize]

/*off=88(22)*/	decal_t		*pdecals;
};	// sizeof (GL_msurface_t) == 92 (23)
struct GL_mnode_t
{
	enum ChildrenType_t
	{
		ChildrenType_Front,
		ChildrenType_Back,

		ChildrenType_Total
	};

// common with leaf
/*! Off=0(0)*/	int			contents;		// 0, to differentiate from leafs
/*! Off=4(1)*/	int			visframe;		// node needs to be traversed if current

/*! Off=8(2)*/	Vector		mins, maxs;		// for bounding box culling

/*! Off=32(8)*/	mnode_t	*parent;

// node specific
/*! Off=36(9)*/	mplane_t	*plane;
/*! Off=40(10)*/	mnode_t	*children[ChildrenType_Total];

/*! Off=48(12)*/	unsigned short		firstsurface;
/*! Off=50(12.5)*/	unsigned short		numsurfaces;
};	// sizeof (GL_mnode_t) == 52 (13)

#define	MAX_LIGHTSTYLES	64
#define	MAX_LIGHTSTYLEVALUE	256

struct lightstyle_t
{
	int  length;
	char map[MAX_LIGHTSTYLES];
};

lightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
int          d_lightstylevalue[MAX_LIGHTSTYLEVALUE];	// 8.8 fraction of base light value
model_t     *sv_worldmodel (NULL);	// Analog of sv.worldmodel.

static inline void SetupLightStyles (void)
{
	// Setup lighting information....

	// reset all light styles
	for (unsigned char index (0u); index < MAX_LIGHTSTYLES; ++index)
	{
		cl_lightstyle[index].length = 0u;
		cl_lightstyle[index].map[0u] = '\0';
	}

	for (unsigned short index (0u); index < MAX_LIGHTSTYLEVALUE; ++index)
		d_lightstylevalue[index] = 264;	// normal light value
}

static inline void R_AnimateLight (void)
{
	// light animations
	// 'm' is normal light, 'a' is no light, 'z' is double bright
	const int i (static_cast <int> (gpGlobals->time * 10.0f));
	int k;

	for (unsigned char j (0u); j < MAX_LIGHTSTYLES; ++j)
	{
		if (cl_lightstyle[j].length == 0u)
		{
			d_lightstylevalue[j] = 256;

			continue;
		}

		k = cl_lightstyle[j].map[i % cl_lightstyle[j].length] - 'a';
		k *= 22;

		d_lightstylevalue[j] = k;
	}	
}

static inline void CallbackLightStyle (const unsigned char style, char *const value)
{
	if (style >= MAX_LIGHTSTYLES)
	{
		g_engfuncs.pfnServerPrint ("SVC_LIGHTSTYLE > MAX_LIGHTSTYLES\n");

		return;
	}

	// OCCURS!
	if (value == NULL)
	{
		cl_lightstyle[style].length = 0u;
		cl_lightstyle[style].map[0u] = '\0';

		return;
	}

	const unsigned short maximumCopyAmount (sizeof (cl_lightstyle[style].map) - sizeof ('\0'));

	strncpy (cl_lightstyle[style].map, value, maximumCopyAmount);

	cl_lightstyle[style].map[maximumCopyAmount] = '\0';

	cl_lightstyle[style].length = strlen (cl_lightstyle[style].map);
}
static inline void CallbackStartFrame (void)
{
	R_AnimateLight ();

	inline void ShowMagic (void);

	ShowMagic ();
}
static inline void CallbackPM_Move (playermove_t *const playerMove, const bool server)
{
	// Reliability checks.
	assert (playerMove != NULL);
	assert (server == true);	// ALWAYS SHOULD BE TRUE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

	// Honestly this is need only once per changelevel, but....
	sv_worldmodel = playerMove->physents[0u].model;	// Always point at sv.worldmodel!

	// Reliability check.
	assert (sv_worldmodel != NULL);
}

static WINAPI GiveFnptrsToDll (enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals)
{
	// get the engine functions from the engine...
	memcpy (&g_engfuncs, pengfuncsFromEngine, sizeof (g_engfuncs));
	gpGlobals = pGlobals;
  
	SetupLightStyles ();
}
static void pfnLightStyle (int style, char *value)
{
	LIGHT_STYLE (style, value);
	or ->>---------->>------------->>---------------------->>-------------------|
																				|
	// Update light style for fake clients....									|
	CallbackLightStyle (static_cast <const unsigned char> (style), value);		|
																				|
	RETURN_META (MRES_IGNORED);	<------------------<<------------<<-------------|
}
static void pfnStartFrame (void)
{
	// this function starts a video frame. It is called once per video frame by the engine. If
	// you run Half-Life at 90 fps, this function will then be called 90 times per second. By
	// placing a hook on it, we have a good place to do things that should be done continuously
	// during the game, for example making the bots think (yes, because no Think() function exists
	// for the bots by the MOD side, remember). Also here we have control on the bot population,
	// for example if a new player joins the server, we should disconnect a bot, and if the
	// player population decreases, we should fill the server with other bots.

	CallbackStartFrame ();

	(*g_engfuncs.pfnStartFrame) ();
	or
	RETURN_META (MRES_IGNORED);
}
static void PM_Move (playermove_t *playerMove, qboolean server)
{
	// this is the player movement code clients run to predict things when the server can't update
	// them often enough (or doesn't want to). The server runs exactly the same function for
	// moving players. There is normally no distinction between them, else client-side prediction
	// wouldn't work properly (and it doesn't work that well, already...)

	CallbackPM_Move (playerMove, server == TRUE);

	(*g_engfuncs.pfnPM_Move) (playerMove, server);
	or
	RETURN_META (MRES_IGNORED);
}

struct Color
{
	int red;
	int green;
	int blue;

	inline       void         Reset  (void)       { red = green = blue = 0; }
	inline const unsigned int GetAvg (void) const { return (red + green + blue) / (sizeof (Color) / sizeof (int)); }
};

/*
=============================================================================

LIGHT SAMPLING

=============================================================================
*/
namespace Light
{
//static const mplane_t *lightplane (NULL);
//static Vector lightspot;
static Color g_pointColor;

template <typename nodeType, typename surfaceType> static const bool RecursiveLightPoint (const nodeType *const node, const Vector &start, const Vector &end)
{
	float front, back, frac;
	int side;
	mplane_t *plane;
	Vector mid;
	surfaceType *surf;
	int s, t, ds, dt;
	int i;
	mtexinfo_t *tex;
	color24 *lightmap;
	unsigned int scale;
	unsigned char maps;

	// Reliability check.
	assert (node != NULL);

	if (node->contents < 0)
		return false;	// didn't hit anything

	// Determine which side of the node plane our points are on
	// FIXME: optimize for axial
	plane = node->plane;
	front = DotProduct (start, plane->normal) - plane->dist;
	back = DotProduct (end, plane->normal) - plane->dist;
	side = front < 0.0f;

	// If they're both on the same side of the plane, don't bother to split just check the appropriate child
	if ((back < 0.0f) == side)
		return RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[side]), start, end);

	// calculate mid point
	frac = front / (front - back);
	mid = start + (end - start) * frac;

	// go down front side	
	if (RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[side]), start, mid))
		return true;	// hit something

	// Blow it off if it doesn't split the plane...
	if ((back < 0.0f) == side)
		return false;	// didn't hit anything

	// check for impact on this node
//	lightspot = mid;
//	lightplane = plane;

	surf = reinterpret_cast <surfaceType *> (sv_worldmodel->surfaces) + node->firstsurface;
	for (i = 0; i < node->numsurfaces; ++i, ++surf)
	{
		if (surf->flags & SURF_DRAWTILED)
			continue;	// no lightmaps

		tex = surf->texinfo;

		// See where in lightmap space our intersection point is
		s = static_cast <int> (DotProduct (mid, Vector (tex->vecs[0])) + tex->vecs[0][3]);
		t = static_cast <int> (DotProduct (mid, Vector (tex->vecs[1])) + tex->vecs[1][3]);

		// Not in the bounds of our lightmap? punt...
		if (s < surf->texturemins[0] || t < surf->texturemins[1])
			continue;

		// assuming a square lightmap (FIXME: which ain't always the case),
		// lets see if it lies in that rectangle. If not, punt...
		ds = s - surf->texturemins[0];
		dt = t - surf->texturemins[1];

		if (ds > surf->extents[0] || dt > surf->extents[1])
			continue;

		if (surf->samples == NULL)
			return true;

		ds >>= 4;
		dt >>= 4;

		g_pointColor.Reset ();	// Reset point color.

		const int smax ((surf->extents[0] >> 4) + 1);
		const int tmax ((surf->extents[1] >> 4) + 1);
		const int size (smax * tmax);

		lightmap = surf->samples + dt * smax + ds;

		// Compute the lightmap color at a particular point
		for (maps = 0u; maps < MAXLIGHTMAPS && surf->styles[maps] != 255u; ++maps)
		{
			scale = d_lightstylevalue[surf->styles[maps]];

			g_pointColor.red += lightmap->r * scale;
			g_pointColor.green += lightmap->g * scale;
			g_pointColor.blue += lightmap->b * scale;

			lightmap += size;	// skip to next lightmap
		}

		g_pointColor.red >>= 8u;
		g_pointColor.green >>= 8u;
		g_pointColor.blue >>= 8u;

		return true;
	}

	// go down back side
	return RecursiveLightPoint <nodeType, surfaceType> (reinterpret_cast <nodeType *> (node->children[!side]), mid, end);
}
inline const bool IsSoftwareDrawingMode (void)
{
	static const bool isSoftwareDrawingMode (IS_DEDICATED_SERVER () || GetModuleHandle ("sw.dll") != NULL);

	return isSoftwareDrawingMode;
}
const bool ActualRecursiveLightPoint (const Vector &start, const Vector &end)
{
	return IsSoftwareDrawingMode () ?
		RecursiveLightPoint <mnode_t, msurface_t> (sv_worldmodel->nodes, start, end) :
		RecursiveLightPoint <GL_mnode_t, GL_msurface_t> (reinterpret_cast <GL_mnode_t *> (sv_worldmodel->nodes), start, end);
}

static inline const unsigned char R_LightPoint (const Vector &p)
{
	// Reliability check.
	if (sv_worldmodel == NULL)
		return 0u;

	if (sv_worldmodel->lightdata == NULL)
		return 255u;

	Vector end (p);

	end.z -= 2048.0f;

	return ActualRecursiveLightPoint (p, end) == false ? 0u : static_cast <unsigned char> (g_pointColor.GetAvg ());
}
}

inline void ShowMagic (void)
{
	edict_t *const hostPlayerEdict (INDEXENT (1u));

	if (hostPlayerEdict == NULL || hostPlayerEdict->free || hostPlayerEdict->pvPrivateData == NULL || (hostPlayerEdict->v.flags & FL_FAKECLIENT))
		return;

	char message[192];
	_snprintf (message, sizeof (message), "ShowMagic(): \"%s\"->v.light_level=%i, R_LightPoint(hostOrg)=%i\n", STRING (hostPlayerEdict->v.netname), hostPlayerEdict->v.light_level, Light::R_LightPoint (hostPlayerEdict->v.origin));
	CLIENT_PRINTF (hostPlayerEdict, print_chat, message);
}
Changes:
1) add the required headers from HLSDK;
2) added definitions of 'SURF_*' constants;
3) type 'BOOL' is changed to 'qboolean';
4) type 'Math::Vector3D' is changed to HLSDK 'Vector';
5) added check "hostPlayerEdict->pvPrivateData == NULL" in a function 'ShowMagic';
6) in a function 'SetupLightStyles' fixed bug related to 'cl_lightstyle' array.
7) changed the name of the function 'g_engfuncs.ServerPrintf' to 'g_engfuncs.pfnServerPrint'
8) function 'DotProduct' is used instead of the overloaded operator logical OR for calculation of scalar product of vectors.

Excuse me. It all is simply a consequence of the porting of code from my bot, and also because of that that I this code up until that time didn't compile/not checked properly....
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#14)
KWo
Developer of PODBot mm
 
KWo's Avatar
 
Status: Offline
Posts: 3,415
Join Date: Apr 2004
Default Re: code to get the illumination at any point on the map - 16-03-2012

Thanks.
I have added all things into my current code and I've got it finally compiling correctly (no errors and no warnings).
It was calling the function Show_Magic() for me as a Host (on my listenserver) to show me my light level (something about 178 on de_dust2). After that I have commented out the call of that function, because I couldn't use the console. Then I've checked bots light_level and it was still 0. I was using PMTOOLS from the filebase.
pEntity->v.light_level = 0
I believe Your code is to make the light_level of bots alive, but - at least on the listenserver CS1.6 steam - it doesn't do the job. Or maybe I misunderstood the point of this code?
[EDIT]
Just checked - on the dedicated server bots light_level is also still 0.
[/EDIT]

Last edited by KWo; 16-03-2012 at 22:09..
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#15)
Immortal_BLG
Member
 
Status: Offline
Posts: 170
Join Date: Nov 2007
Location: Russian Federation
Default Re: code to get the illumination at any point on the map - 17-03-2012

Quote:
I've checked bots light_level and it was still 0. I was using PMTOOLS from the filebase.
pEntity->v.light_level = 0
I believe Your code is to make the light_level of bots alive, but - at least on the listenserver CS1.6 steam - it doesn't do the job. Or maybe I misunderstood the point of this code?
[EDIT]
Just checked - on the dedicated server bots light_level is also still 0.
[/EDIT]
Of course all that will be as you describe
Because you do not assign a value of illumination received after the call of "Light::R_LightPoint" to variable "bot->v.light_level"!!
To get everything working as it should you just have to after each function call "pfnRunPlayerMove" to add the code:
Code:
if (!pBot->bDead)
   pEdict->v.light_level = Light::R_LightPoint (pEdict->v.origin);
and that's all!!!

as a result the code should look like:
Code:
g_engfuncs.pfnRunPlayerMove (pEdict, vecMoveAngles, pBot->f_move_speed, pBot->f_sidemove_speed, 0, pEdict->v.button, 0, (unsigned char) i_msecval);	// KWo - 25.09.2006 - thanks to THE_STORM

if (!pBot->bDead)
   pEdict->v.light_level = Light::R_LightPoint (pEdict->v.origin);
Why after calling of function "pfnRunPlayerMove"?
Because this function resets back to zero value of bot light_level and we just restores it to normal....
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#16)
KWo
Developer of PODBot mm
 
KWo's Avatar
 
Status: Offline
Posts: 3,415
Join Date: Apr 2004
Default Re: code to get the illumination at any point on the map - 17-03-2012

Thanks. It works now. I have rewritten the UTIL_IlluminationOf function. I cannot remove the Illumination entity (that one based on mechgibs.mdl) because there might be still other bots on the server (like CZERO bots other podbot clone and so on) and their light_level still would be 0.
Or maybe there is a way to run Your function for all users/bots from my dll?

[EDIT]
I cannot compile it for linux, because of the function GetModuleHandle (coming from WinBase.h - not existing for linux). I need a replacement for linux. Whistler would help with it.
[/EDIT]

Last edited by KWo; 17-03-2012 at 22:34..
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#17)
Immortal_BLG
Member
 
Status: Offline
Posts: 170
Join Date: Nov 2007
Location: Russian Federation
Default Re: code to get the illumination at any point on the map - 18-03-2012

Quote:
Originally Posted by KWo
I cannot remove the Illumination entity (that one based on mechgibs.mdl) because there might be still other bots on the server (like CZERO bots other podbot clone and so on) and their light_level still would be 0.
Or maybe there is a way to run Your function for all users/bots from my dll?
Of course you can do it!
Way 1, inaccurate:
Code:
///........................
   // Record some Stats of all Players on the Server
   g_iNum_players = 0;
   g_iNum_humans = 0;
   g_iNum_hum_tm = 0;   // KWo - 08.03.2010
   bAliveHumans = false;
   g_iAliveCTs = 0;  // KWo - 19.01.2008
   g_iAliveTs = 0;   // KWo - 19.01.2008
   for (player_index = 0; player_index < gpGlobals->maxClients; player_index++)
   {
      pPlayer = INDEXENT (player_index + 1);

      if (!FNullEnt (pPlayer) && (pPlayer->v.flags & FL_CLIENT))
      {
         g_iNum_players++;
         clients[player_index].pEdict = pPlayer;
         clients[player_index].iFlags |= CLIENT_USED;
         IsAlive (pPlayer) ? clients[player_index].iFlags |= CLIENT_ALIVE : clients[player_index].iFlags &= ~CLIENT_ALIVE;

//////////// BEGINNING OF NEW CODE \\\\\\\\\\\\\\\\\\\\\\\\
         if ((pPlayer->v.flags & FL_FAKECLIENT) && (clients[player_index].iFlags & CLIENT_ALIVE))
            pPlayer->v.light_level = Light::R_LightPoint (pPlayer->v.origin);
//////////// END OF NEW CODE \\\\\\\\\\\\\\\\\\\\\\\\
         if ((clients[player_index].iTeam == TEAM_CS_TERRORIST) && (clients[player_index].iFlags & CLIENT_ALIVE)) // KWo - 19.01.2008
            g_iAliveTs++;
         if ((clients[player_index].iTeam == TEAM_CS_COUNTER) && (clients[player_index].iFlags & CLIENT_ALIVE))    // KWo - 19.01.2008
            g_iAliveCTs++;
/// ...................................
Or a way 2, more correct:
Code:
static void RunPlayerMove_Post (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec)
{
   if (IsAlive (fakeclient))
      fakeclient->v.light_level = Light::R_LightPoint (fakeclient->v.origin);

   RETURN_META (MRES_IGNORED);
}
C_DLLEXPORT int GetEngineFunctions_Post (enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion)
{
   // ....
   meta_engfuncs_post.pfnRunPlayerMove = RunPlayerMove_Post;
   // ....
}
But of course for both methods you need to remove code, which you have added earlier from my previous post.

BTW.
Taken from Source SDK interface.cpp:
Code:
#ifdef _LINUX
// Linux doesn't have this function so this emulates its functionality
void *GetModuleHandle(const char *name)
{
	void *handle;

	if( name == NULL )
	{
		// hmm, how can this be handled under linux....
		// is it even needed?
		return NULL;
	}

    if( (handle=dlopen(name, RTLD_NOW))==NULL)
    {
            // couldn't open this file
            return NULL;
    }

	// read "man dlopen" for details
	// in short dlopen() inc a ref count
	// so dec the ref count by performing the close
	dlclose(handle);
	return handle;
}
#endif

Last edited by Immortal_BLG; 18-03-2012 at 07:31..
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#18)
KWo
Developer of PODBot mm
 
KWo's Avatar
 
Status: Offline
Posts: 3,415
Join Date: Apr 2004
Default Re: code to get the illumination at any point on the map - 18-03-2012

I'm having troubles with compiling under cygwin with that function
void *GetModuleHandle(const char *name)
After adding it to botglobals.h the compiler says it is defined twice (which really isn't). When I'm compiling it under mingw it also says about some problems:
obj.win32/bot.o:bot.cpp.text+0x1a822): undefined reference to `bool const Light::RecursiveLightPoint<mnode_s, msurface_s>(mnode_s const*, Vector const&, Vector const&)'
obj.win32/bot.o:bot.cpp.text+0x1b08b): undefined reference to `bool const Light::RecursiveLightPoint<GL_mnode_t, GL_msurface_t>(GL_mnode_t const*, Vector const&, Vector const&)'
collect2: ld returned 1 exit status
make: *** [obj.win32/podbot_mm.dll] Error 1

What does it mean that kind of messages like (.text+0x1a822)?

About GetModuleHandle ("sw.dll") - what exactly is this check for?

Isn't just the same as a check (!FNullEnt (pHostEdict))?
Another thing - there is no listenserver for a linux...
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#19)
Immortal_BLG
Member
 
Status: Offline
Posts: 170
Join Date: Nov 2007
Location: Russian Federation
Default Re: code to get the illumination at any point on the map - 18-03-2012

First of all, I want to refute my previous post a little.
The second way is incorrect, as metamod doesn't do callbacks for its plug-ins, I have forgotten about it, forgive me again So use the first method....

About your last post:
Change:
Code:
void *GetModuleHandle(const char *name)
to:
Code:
inline void *GetModuleHandle(const char *name)
or:
Code:
extern inline void *GetModuleHandle(const char *name)
   
Reply With Quote
Re: code to get the illumination at any point on the map
Old
  (#20)
KWo
Developer of PODBot mm
 
KWo's Avatar
 
Status: Offline
Posts: 3,415
Join Date: Apr 2004
Default Re: code to get the illumination at any point on the map - 19-03-2012

How about that below?
Quote:
Originally Posted by KWo View Post
What does it mean that kind of messages like (.text+0x1a822)?

About GetModuleHandle ("sw.dll") - what exactly is this check for?

Isn't just the same as a check (!FNullEnt (pHostEdict))?
Another thing - there is no listenserver for a linux...
   
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump



Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
vBulletin Skin developed by: vBStyles.com