|
General Bot Coding See what a pain it is to get those little mechs shooting around
|
|
Member
Status: Offline
Posts: 171
Join Date: Nov 2007
Location: Russian Federation
|
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....
|
|
|
|
|
Developer of PODBot mm
Status: Offline
Posts: 3,425
Join Date: Apr 2004
|
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..
|
|
|
|
|
Member
Status: Offline
Posts: 171
Join Date: Nov 2007
Location: Russian Federation
|
Re: code to get the illumination at any point on the map -
16-03-2012
Quote:
Originally Posted by KWo
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....
|
|
|
|
|
Developer of PODBot mm
Status: Offline
Posts: 3,425
Join Date: Apr 2004
|
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..
|
|
|
|
|
Member
Status: Offline
Posts: 171
Join Date: Nov 2007
Location: Russian Federation
|
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....
|
|
|
|
|
Developer of PODBot mm
Status: Offline
Posts: 3,425
Join Date: Apr 2004
|
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..
|
|
|
|
|
Member
Status: Offline
Posts: 171
Join Date: Nov 2007
Location: Russian Federation
|
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..
|
|
|
|
|
Developer of PODBot mm
Status: Offline
Posts: 3,425
Join Date: Apr 2004
|
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...
|
|
|
|
|
Member
Status: Offline
Posts: 171
Join Date: Nov 2007
Location: Russian Federation
|
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)
|
|
|
|
|
Developer of PODBot mm
Status: Offline
Posts: 3,425
Join Date: Apr 2004
|
Re: code to get the illumination at any point on the map -
19-03-2012
How about that below?
Quote:
Originally Posted by KWo
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...
|
|
|
|
Currently Active Users Viewing This Thread: 3 (0 members and 3 guests)
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
Powered by vBulletin® Version 3.8.2 Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
vBulletin Skin developed by: vBStyles.com
|
|