int UserMessages::GetMessageIndex(const char *msg)
{
	int msgid;

	if (!sm_trie_retrieve(m_Names, msg, reinterpret_cast<void **>(&msgid)))
	{
		if (m_FallbackSearch)
		{
			char msgbuf[64];
			int size;
			msgid = 0;

			while (gamedll->GetUserMessageInfo(msgid, msgbuf, sizeof(msgbuf), size))
			{
				if (strcmp(msgbuf, msg) == 0)
				{
					sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
					return msgid;
				}
				msgid++;
			}
		}

		msgid = g_SMAPI->FindUserMessage(msg);

		if (msgid != INVALID_MESSAGE_ID)
		{
			sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
		}
	}

	return msgid;
}
DataTableInfo *CHalfLife2::_FindServerClass(const char *classname)
{
	DataTableInfo *pInfo = NULL;

	if (!sm_trie_retrieve(m_pClasses, classname, (void **)&pInfo))
	{
		ServerClass *sc = gamedll->GetAllServerClasses();
		while (sc)
		{
			if (strcmp(classname, sc->GetName()) == 0)
			{
				pInfo = new DataTableInfo;
				pInfo->sc = sc;
				sm_trie_insert(m_pClasses, classname, pInfo);
				m_Tables.push_back(pInfo);
				break;
			}
			sc = sc->m_pNext;
		}
		if (!pInfo)
		{
			return NULL;
		}
	}

	return pInfo;
}
Example #3
0
void AdminCache::AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule)
{
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
	{
		return;
	}

	Trie *pTrie = NULL;
	if (type == Override_Command)
	{
		if (pGroup->pCmdTable == NULL)
		{
			pGroup->pCmdTable = sm_trie_create();
		}
		pTrie = pGroup->pCmdTable;
	} else if (type == Override_CommandGroup) {
		if (pGroup->pCmdGrpTable == NULL)
		{
			pGroup->pCmdGrpTable = sm_trie_create();
		}
		pTrie = pGroup->pCmdGrpTable;
	} else {
		return;
	}

	sm_trie_insert(pTrie, name, (void *)(int)rule);
}
Example #4
0
GroupId AdminCache::AddGroup(const char *group_name)
{
	if (sm_trie_retrieve(m_pGroups, group_name, NULL))
	{
		return INVALID_GROUP_ID;
	}

	GroupId id;
	AdminGroup *pGroup;
	if (m_FreeGroupList != INVALID_GROUP_ID)
	{
		pGroup = (AdminGroup *)m_pMemory->GetAddress(m_FreeGroupList);
		assert(pGroup->magic == GRP_MAGIC_UNSET);
		id = m_FreeGroupList;
		m_FreeGroupList = pGroup->next_grp;
	} else {
		id = m_pMemory->CreateMem(sizeof(AdminGroup), (void **)&pGroup);
	}

	pGroup->immunity_level = 0;
	pGroup->immune_table = -1;
	pGroup->magic = GRP_MAGIC_SET;
	pGroup->next_grp = INVALID_GROUP_ID;
	pGroup->pCmdGrpTable = NULL;
	pGroup->pCmdTable = NULL;
	pGroup->addflags = 0;

	if (m_FirstGroup == INVALID_GROUP_ID)
	{
		m_FirstGroup = id;
		m_LastGroup = id;
		pGroup->prev_grp = INVALID_GROUP_ID;
	} else {
		AdminGroup *pPrev = (AdminGroup *)m_pMemory->GetAddress(m_LastGroup);
		assert(pPrev->magic == GRP_MAGIC_SET);
		pPrev->next_grp = id;
		pGroup->prev_grp = m_LastGroup;
		m_LastGroup = id;
	}

	int nameidx = m_pStrings->AddString(group_name);
	pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
	pGroup->nameidx = nameidx;

	sm_trie_insert(m_pGroups, group_name, (void *)id);

	return id;
}
Example #5
0
void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags)
{
	Trie *pTrie = NULL;
	if (type == Override_Command)
	{
		pTrie = m_pCmdOverrides;
	} else if (type == Override_CommandGroup) {
		pTrie = m_pCmdGrpOverrides;
	} else {
		return;
	}

	sm_trie_insert(pTrie, cmd, (void *)(unsigned int)flags);

	g_ConCmds.UpdateAdminCmdFlags(cmd, type, flags, false);
}
Example #6
0
void AdminCache::RegisterAuthIdentType(const char *name)
{
	if (sm_trie_retrieve(m_pAuthTables, name, NULL))
	{
		return;
	}

	Trie *pAuth = sm_trie_create();

	AuthMethod method;
	method.name.assign(name);
	method.table = pAuth;

	m_AuthMethods.push_back(method);

	sm_trie_insert(m_pAuthTables, name, pAuth);
}
typedescription_t *CHalfLife2::FindInDataMap(datamap_t *pMap, const char *offset)
{
	typedescription_t *td = NULL;
	DataMapTrie &val = m_Maps[pMap];

	if (!val.trie)
	{
		val.trie = sm_trie_create();
	}
	if (!sm_trie_retrieve(val.trie, offset, (void **)&td))
	{
		if ((td = UTIL_FindInDataMap(pMap, offset)) != NULL)
		{
			sm_trie_insert(val.trie, offset, td);
		}
	}

	return td;
}
Example #8
0
bool Translator::AddLanguage(const char *langcode, const char *description)
{
	if (sm_trie_retrieve(m_pLCodeLookup, langcode, NULL))
	{
		return false;
	}

	Language *pLanguage = new Language;
	unsigned int idx = m_Languages.size();

	UTIL_Format(pLanguage->m_code2, sizeof(pLanguage->m_code2), "%s", langcode);
	pLanguage->m_FullName = m_pStringTab->AddString(description);

	sm_trie_insert(m_pLCodeLookup, langcode, reinterpret_cast<void *>(idx));

	m_Languages.push_back(pLanguage);

	return true;
}
bool RootConsoleMenu::AddRootConsoleCommand(const char *cmd, const char *text, IRootConsoleCommand *pHandler)
{
	if (sm_trie_retrieve(m_pCommands, cmd, NULL))
	{
		return false;
	}

	sm_trie_insert(m_pCommands, cmd, pHandler);

	/* Sort this into the menu */
	List<ConsoleEntry *>::iterator iter = m_Menu.begin();
	ConsoleEntry *pEntry;
	bool inserted = false;
	while (iter != m_Menu.end())
	{
		pEntry = (*iter);
		if (strcmp(cmd, pEntry->command.c_str()) < 0)
		{
			ConsoleEntry *pNew = new ConsoleEntry;
			pNew->command.assign(cmd);
			pNew->description.assign(text);
			m_Menu.insert(iter, pNew);
			inserted = true;
			break;
		}
		iter++;
	}

	if (!inserted)
	{
		ConsoleEntry *pNew = new ConsoleEntry;
		pNew->command.assign(cmd);
		pNew->description.assign(text);
		m_Menu.push_back(pNew);
	}

	return true;
}
Example #10
0
bool AdminCache::BindAdminIdentity(AdminId id, const char *auth, const char *ident)
{
	if (ident[0] == '\0')
	{
		return false;
	}

	AdminUser *pUser = (AdminUser *)m_pMemory->GetAddress(id);
	if (!pUser || pUser->magic != USR_MAGIC_SET)
	{
		return false;
	}

	Trie *pTable;
	if (!sm_trie_retrieve(m_pAuthTables, auth, (void **)&pTable))
	{
		return false;
	}

	/* If the id was a steam id strip off the STEAM_*: part */
	if (strcmp(auth, "steam") == 0 && strncmp(ident, "STEAM_", 6) == 0)
	{
		ident += 8;
	}

	if (sm_trie_retrieve(pTable, ident, NULL))
	{
		return false;
	}

	int i_ident = m_pStrings->AddString(ident);

	pUser = (AdminUser *)m_pMemory->GetAddress(id);
	pUser->auth.identidx = i_ident;
	GetMethodIndex(auth, &pUser->auth.index);

	return sm_trie_insert(pTable, ident, (void **)id);
}
EventHookError EventManager::HookEvent(const char *name, IPluginFunction *pFunction, EventHookMode mode)
{
	EventHook *pHook;

	/* If we aren't listening to this event... */
	if (!gameevents->FindListener(this, name))
	{
		/* Then add ourselves */
		if (!gameevents->AddListener(this, name, true))
		{
			/* If event doesn't exist... */
			return EventHookErr_InvalidEvent;
		}
	}

	/* If a hook structure does not exist... */
	if (!sm_trie_retrieve(m_EventHooks, name, (void **)&pHook))
	{
		EventHookList *pHookList;
		IPlugin *plugin = g_PluginSys.GetPluginByCtx(pFunction->GetParentContext()->GetContext());

		/* Check plugin for an existing EventHook list */
		if (!plugin->GetProperty("EventHooks", (void **)&pHookList))
		{
			pHookList = new EventHookList();
			plugin->SetProperty("EventHooks", pHookList);
		}

		/* Create new GameEventHook structure */
		pHook = new EventHook();

		if (mode == EventHookMode_Pre)
		{
			/* Create forward for a pre hook */
			pHook->pPreHook = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, GAMEEVENT_PARAMS);
			/* Add to forward list */
			pHook->pPreHook->AddFunction(pFunction);
		} else {
			/* Create forward for a post hook */
			pHook->pPostHook = g_Forwards.CreateForwardEx(NULL, ET_Ignore, 3, GAMEEVENT_PARAMS);
			/* Should we copy data from a pre hook to the post hook? */
			pHook->postCopy = (mode == EventHookMode_Post);
			/* Add to forward list */
			pHook->pPostHook->AddFunction(pFunction);
		}

		/* Increase reference count */
		pHook->refCount++;

		/* Add hook structure to hook lists */
		pHookList->push_back(pHook);
		sm_trie_insert(m_EventHooks, name, pHook);

		return EventHookErr_Okay;
	}

	/* Hook structure already exists at this point */

	if (mode == EventHookMode_Pre)
	{
		/* Create pre hook forward if necessary */
		if (!pHook->pPreHook)
		{
			pHook->pPreHook = g_Forwards.CreateForwardEx(NULL, ET_Event, 3, GAMEEVENT_PARAMS);
		}

		/* Add plugin function to forward list */
		pHook->pPreHook->AddFunction(pFunction);
	} else {
		/* Create post hook forward if necessary */
		if (!pHook->pPostHook)
		{
			pHook->pPostHook = g_Forwards.CreateForwardEx(NULL, ET_Ignore, 3, GAMEEVENT_PARAMS);
		}

		/* If postCopy is false, then we may want to set it to true */
		if (!pHook->postCopy)
		{
			pHook->postCopy = (mode == EventHookMode_Post);
		}

		/* Add plugin function to forward list */
		pHook->pPostHook->AddFunction(pFunction);
	}

	/* Increase reference count */
	pHook->refCount++;

	return EventHookErr_Okay;
}
Example #12
0
void AdminCache::NameFlag(const char *str, AdminFlag flag)
{
	sm_trie_insert(m_pLevelNames, str, (void *)flag);
}
Example #13
0
SMCResult CPhraseFile::ReadSMC_NewSection(const SMCStates *states, const char *name)
{
	bool recognized = false;
	if (m_ParseState == PPS_None)
	{
		if (strcmp(name, "Phrases") == 0)
		{
			m_ParseState = PPS_Phrases;
			recognized = true;
		}
	} 
	else if (m_ParseState == PPS_Phrases) 
	{
		m_ParseState = PPS_InPhrase;
		recognized = true;

		void *value;
		if (sm_trie_retrieve(m_pPhraseLookup, name, &value))
		{
			m_CurPhrase = reinterpret_cast<int>(value);
		}
		else
		{
			phrase_t *pPhrase;

			m_CurPhrase = m_pMemory->CreateMem(sizeof(phrase_t), (void **)&pPhrase);
			sm_trie_insert(m_pPhraseLookup, name, reinterpret_cast<void *>(m_CurPhrase));

			/* Initialize new phrase */
			trans_t *pTrans;

			pPhrase->fmt_count = 0;
			pPhrase->fmt_list = -1;

			int trans_tbl = m_pMemory->CreateMem(sizeof(trans_t) * m_LangCount, (void **)&pTrans);
			pPhrase = (phrase_t *)m_pMemory->GetAddress(m_CurPhrase);
			pPhrase->trans_tbl = trans_tbl;

			pPhrase->translations = 0;
			pPhrase->fmt_bytes = 0;

			for (unsigned int i=0; i<m_LangCount; i++)
			{
				pTrans[i].stridx = -1;
			}
		}

		m_LastPhraseString.assign(name);
	} 
	else if (m_ParseState == PPS_InPhrase) 
	{
		ParseError("Phrase sections may not have sub-sections");
		return SMCResult_HaltFail;
	}

	if (!recognized)
	{
		ParseWarning("Ignoring invalid section \"%s\" on line %d.", name, states->line);
	}

	return SMCResult_Continue;
}
Example #14
0
HandleType_t HandleSystem::CreateType(const char *name,
                                      IHandleTypeDispatch *dispatch,
                                      HandleType_t parent,
                                      const TypeAccess *typeAccess,
                                      const HandleAccess *hndlAccess,
                                      IdentityToken_t *ident,
                                      HandleError *err)
{
    if (!dispatch)
    {
        if (err)
        {
            *err = HandleError_Parameter;
        }
        return 0;
    }

    if (typeAccess && typeAccess->hsVersion > SMINTERFACE_HANDLESYSTEM_VERSION)
    {
        if (err)
        {
            *err = HandleError_Version;
        }
        return 0;
    }

    if (hndlAccess && hndlAccess->hsVersion > SMINTERFACE_HANDLESYSTEM_VERSION)
    {
        if (err)
        {
            *err = HandleError_Version;
        }
        return 0;
    }

    bool isChild = false;

    if (parent != 0)
    {
        isChild = true;
        if (parent & HANDLESYS_SUBTYPE_MASK)
        {
            if (err)
            {
                *err = HandleError_NoInherit;
            }
            return 0;
        }
        if (parent >= HANDLESYS_TYPEARRAY_SIZE
                || m_Types[parent].dispatch == NULL)
        {
            if (err)
            {
                *err = HandleError_Parameter;
            }
            return 0;
        }
        if (m_Types[parent].typeSec.access[HTypeAccess_Inherit] == false
                && (m_Types[parent].typeSec.ident != ident))
        {
            if (err)
            {
                *err = HandleError_Access;
            }
            return 0;
        }
    }

    if (name && name[0] != '\0')
    {
        if (sm_trie_retrieve(m_TypeLookup, name, NULL))
        {
            if (err)
            {
                *err = HandleError_Parameter;
            }
            return 0;
        }
    }

    unsigned int index;

    if (isChild)
    {
        QHandleType *pParent = &m_Types[parent];
        if (pParent->children >= HANDLESYS_MAX_SUBTYPES)
        {
            if (err)
            {
                *err = HandleError_Limit;
            }
            return 0;
        }
        index = 0;
        for (unsigned int i=1; i<=HANDLESYS_MAX_SUBTYPES; i++)
        {
            if (m_Types[parent + i].dispatch == NULL)
            {
                index = parent + i;
                break;
            }
        }
        if (!index)
        {
            if (err)
            {
                *err = HandleError_Limit;
            }
            return 0;
        }
        pParent->children++;
    } else {
        if (m_FreeTypes == 0)
        {
            /* Reserve another index */
            if (m_TypeTail >= HANDLESYS_TYPEARRAY_SIZE)
            {
                if (err)
                {
                    *err = HandleError_Limit;
                }
                return 0;
            } else {
                m_TypeTail += (HANDLESYS_MAX_SUBTYPES + 1);
                index = m_TypeTail;
            }
        } else {
            /* The "free array" is compacted into the normal array for easiness */
            index = m_Types[m_FreeTypes--].freeID;
        }
    }

    QHandleType *pType = &m_Types[index];

    pType->dispatch = dispatch;
    if (name && name[0] != '\0')
    {
        pType->nameIdx = m_strtab->AddString(name);
        sm_trie_insert(m_TypeLookup, name, (void *)pType);
    } else {
        pType->nameIdx = -1;
    }

    pType->opened = 0;

    if (typeAccess)
    {
        pType->typeSec = *typeAccess;
    } else {
        InitAccessDefaults(&pType->typeSec, NULL);
        pType->typeSec.ident = ident;
    }

    if (hndlAccess)
    {
        pType->hndlSec = *hndlAccess;
    } else {
        InitAccessDefaults(NULL, &pType->hndlSec);
    }

    if (!isChild)
    {
        pType->children = 0;
    }

    return index;
}