.:: Bots United ::.

.:: Bots United ::. (http://forums.bots-united.com/index.php)
-   General Bot Coding (http://forums.bots-united.com/forumdisplay.php?f=24)
-   -   code to get the illumination at any point on the map (http://forums.bots-united.com/showthread.php?t=9005)

Immortal_BLG 13-03-2012 02:34

Re: code to get the illumination at any point on the map
 
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....

KWo 15-03-2012 19:59

Re: code to get the illumination at any point on the map
 
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]

Immortal_BLG 16-03-2012 01:33

Re: code to get the illumination at any point on the map
 
Quote:

Originally Posted by KWo (Post 64319)
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....

KWo 16-03-2012 20:45

Re: code to get the illumination at any point on the map
 
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]

Immortal_BLG 17-03-2012 03:15

Re: code to get the illumination at any point on the map
 
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 :D
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....

KWo 17-03-2012 21:18

Re: code to get the illumination at any point on the map
 
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]

Immortal_BLG 18-03-2012 06:15

Re: code to get the illumination at any point on the map
 
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


KWo 18-03-2012 21:40

Re: code to get the illumination at any point on the map
 
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...

Immortal_BLG 18-03-2012 21:54

Re: code to get the illumination at any point on the map
 
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)

KWo 19-03-2012 07:12

Re: code to get the illumination at any point on the map
 
How about that below?
Quote:

Originally Posted by KWo (Post 64327)
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...



All times are GMT +2. The time now is 16:28.

Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.