i added g_shrubbot.c to the source files and etpub.h to the header, where do i include g_shrubot.h, i still get that error. my g_local.h looks like this:
// g_local.h -- local definitions for game module
#include "q_shared.h"
#include "bg_public.h"
#include "g_public.h"
#include "../game/be_aas.h"
#include "g_shrubbot.h"
my g_shrubbot.h file is what it is when it was patched,
#ifndef _G_SHRUBBOT_H
#define _G_SHRUBBOT_H
#define MAX_SHRUBBOT_LEVELS 32
#define MAX_SHRUBBOT_ADMINS 1024
#define MAX_SHRUBBOT_BANS 1024
#define MAX_SHRUBBOT_FLAGS 32
#define MAX_SHRUBBOT_CMD_LEN 17
#define SBF_IMMUNITY '1'
#define SBF_NOCENSORFLOOD '2'
#define SBF_STEALTH '3'
#define SBF_FORCETEAMCHANGE '5'
#define SBF_UNACCOUNTABLE '6'
#define SBF_CAN_PERM_BAN '8'
#define SBF_TEAMFTSHRUBCMD '9'
// expires field seems to be offset by (30 years - 54 hours)... go figure
#define SHRUBBOT_BAN_EXPIRE_OFFSET 946490400
#define SHRUBBOT_MAX_LOL_NADES 16
struct g_shrubbot_cmd {
const char *keyword;
qboolean (* const handler)(gentity_t *ent, int skiparg);
char flag;
};
typedef struct g_shrubbot_level {
int level;
char name[MAX_NAME_LENGTH];
char flags[MAX_SHRUBBOT_FLAGS];
} g_shrubbot_level_t;
typedef struct g_shrubbot_admin {
char guid[33];
char name[MAX_NAME_LENGTH];
int level;
char flags[MAX_SHRUBBOT_FLAGS];
} g_shrubbot_admin_t;
typedef struct g_shrubbot_ban {
char name[MAX_NAME_LENGTH];
char guid[33];
char ip[18];
char reason[MAX_STRING_CHARS];
char made[50]; // big enough for strftime() %c
int expires;
char banner[MAX_NAME_LENGTH];
} g_shrubbot_ban_t;
qboolean G_shrubbot_ban_check(char *userinfo);
qboolean G_shrubbot_cmd_check(gentity_t *ent);
qboolean G_shrubbot_readconfig(gentity_t *ent, int skiparg);
qboolean G_shrubbot_time(gentity_t *ent, int skiparg);
qboolean G_shrubbot_setlevel(gentity_t *ent, int skiparg);
qboolean G_shrubbot_kick(gentity_t *ent, int skiparg);
qboolean G_shrubbot_ban(gentity_t *ent, int skiparg);
qboolean G_shrubbot_unban(gentity_t *ent, int skiparg);
qboolean G_shrubbot_putteam(gentity_t *ent, int skiparg);
qboolean G_shrubbot_pause(gentity_t *ent, int skiparg);
qboolean G_shrubbot_unpause(gentity_t *ent, int skiparg);
qboolean G_shrubbot_listplayers(gentity_t *ent, int skiparg);
qboolean G_shrubbot_mute(gentity_t *ent, int skiparg);
qboolean G_shrubbot_showbans(gentity_t *ent, int skiparg);
qboolean G_shrubbot_help(gentity_t *ent, int skiparg);
qboolean G_shrubbot_admintest(gentity_t *ent, int skiparg);
qboolean G_shrubbot_cancelvote(gentity_t *ent, int skiparg);
qboolean G_shrubbot_spec999(gentity_t *ent, int skiparg);
qboolean G_shrubbot_shuffle(gentity_t *ent, int skiparg);
qboolean G_shrubbot_rename(gentity_t *ent, int skiparg);
qboolean G_shrubbot_gib(gentity_t *ent, int skiparg);
qboolean G_shrubbot_slap(gentity_t *ent, int skiparg);
qboolean G_shrubbot_burn(gentity_t *ent, int skiparg);
qboolean G_shrubbot_warn(gentity_t *ent, int skiparg);
qboolean G_shrubbot_news(gentity_t *ent, int skiparg);
qboolean G_shrubbot_lock(gentity_t *ent, int skiparg);
qboolean G_shrubbot_unlock(gentity_t *ent, int skiparg);
qboolean G_shrubbot_lockteams(gentity_t *ent, int skiparg, qboolean toLock);
qboolean G_shrubbot_lol(gentity_t *ent, int skiparg);
qboolean G_shrubbot_pip(gentity_t *ent, int skiparg);
qboolean G_shrubbot_pop(gentity_t *ent, int skiparg);
qboolean G_shrubbot_reset(gentity_t *ent, int skiparg);
qboolean G_shrubbot_fling(gentity_t *ent, int skiparg);
qboolean G_shrubbot_match_one_player(int *plist, char *err, int len);
qboolean G_shrubbot_permission(gentity_t *ent, char flag);
void G_shrubbot_print(gentity_t *ent, char *m);
#endif /* ifndef _G_SHRUBBOT_H */