initial user message implementation with its natives and such
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40511
This commit is contained in:
parent
c91542fbe8
commit
0fbb38ef8e
63
core/CMsgIdPool.h
Normal file
63
core/CMsgIdPool.h
Normal file
@ -0,0 +1,63 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* ===============================================================
|
||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||
* ===============================================================
|
||||
*
|
||||
* This file is not open source and may not be copied without explicit
|
||||
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||
* in whole or significant part.
|
||||
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||
*
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE_SOURCEMOD_CMSGIDPOOL_H_
|
||||
#define _INCLUDE_SOURCEMOD_CMSGIDPOOL_H_
|
||||
|
||||
#include "sm_trie.h"
|
||||
#include "sourcemm_api.h"
|
||||
|
||||
#define INVALID_MESSAGE_ID -1
|
||||
|
||||
class CMessageIdPool
|
||||
{
|
||||
public:
|
||||
CMessageIdPool()
|
||||
{
|
||||
m_Names = sm_trie_create();
|
||||
}
|
||||
~CMessageIdPool()
|
||||
{
|
||||
sm_trie_destroy(m_Names);
|
||||
}
|
||||
public:
|
||||
int GetMessageId(const char *name)
|
||||
{
|
||||
int msgid;
|
||||
if (!sm_trie_retrieve(m_Names, name, reinterpret_cast<void **>(&msgid)))
|
||||
{
|
||||
char buf[255];
|
||||
int dummy;
|
||||
msgid = 0;
|
||||
|
||||
while (gamedll->GetUserMessageInfo(msgid, buf, sizeof(buf), dummy))
|
||||
{
|
||||
if (strcmp(name, buf) == 0)
|
||||
{
|
||||
sm_trie_insert(m_Names, name, reinterpret_cast<void *>(msgid));
|
||||
return msgid;
|
||||
}
|
||||
msgid++;
|
||||
}
|
||||
|
||||
return INVALID_MESSAGE_ID;
|
||||
}
|
||||
|
||||
return msgid;
|
||||
}
|
||||
private:
|
||||
Trie *m_Names;
|
||||
};
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_CMSGIDPOOL_H_
|
91
core/CellRecipientFilter.h
Normal file
91
core/CellRecipientFilter.h
Normal file
@ -0,0 +1,91 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* ===============================================================
|
||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||
* ===============================================================
|
||||
*
|
||||
* This file is not open source and may not be copied without explicit
|
||||
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||
* in whole or significant part.
|
||||
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||
*
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE_SOURCEMOD_CELLRECIPIENTFILTER_H_
|
||||
#define _INCLUDE_SOURCEMOD_CELLRECIPIENTFILTER_H_
|
||||
|
||||
#include <irecipientfilter.h>
|
||||
#include <sp_vm_types.h>
|
||||
|
||||
class CellRecipientFilter : public IRecipientFilter
|
||||
{
|
||||
public:
|
||||
CellRecipientFilter() : m_Reliable(false), m_InitMessage(false), m_Size(0), m_CellRecipients(NULL) {}
|
||||
~CellRecipientFilter() {}
|
||||
public: //IRecipientFilter
|
||||
bool IsReliable() const;
|
||||
bool IsInitMessage() const;
|
||||
int GetRecipientCount() const;
|
||||
int GetRecipientIndex(int slot) const;
|
||||
public:
|
||||
void SetRecipientPtr(cell_t *ptr, size_t count);
|
||||
void SetReliable(bool isreliable);
|
||||
void SetInitMessage(bool isinitmsg);
|
||||
void ResetFilter();
|
||||
private:
|
||||
bool m_Reliable;
|
||||
bool m_InitMessage;
|
||||
size_t m_Size;
|
||||
cell_t *m_CellRecipients;
|
||||
};
|
||||
|
||||
inline void CellRecipientFilter::ResetFilter()
|
||||
{
|
||||
m_Reliable = false;
|
||||
m_InitMessage = false;
|
||||
m_Size = 0;
|
||||
m_CellRecipients = NULL;
|
||||
}
|
||||
|
||||
inline bool CellRecipientFilter::IsReliable() const
|
||||
{
|
||||
return m_Reliable;
|
||||
}
|
||||
|
||||
inline bool CellRecipientFilter::IsInitMessage() const
|
||||
{
|
||||
return m_InitMessage;
|
||||
}
|
||||
|
||||
inline int CellRecipientFilter::GetRecipientCount() const
|
||||
{
|
||||
return m_Size;
|
||||
}
|
||||
|
||||
inline int CellRecipientFilter::GetRecipientIndex(int slot) const
|
||||
{
|
||||
if ((slot < 0) || (slot >= GetRecipientCount()))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return static_cast<int>(m_CellRecipients[slot]);
|
||||
}
|
||||
|
||||
inline void CellRecipientFilter::SetInitMessage(bool isinitmsg)
|
||||
{
|
||||
m_InitMessage = isinitmsg;
|
||||
}
|
||||
|
||||
inline void CellRecipientFilter::SetReliable(bool isreliable)
|
||||
{
|
||||
m_Reliable = isreliable;
|
||||
}
|
||||
|
||||
inline void CellRecipientFilter::SetRecipientPtr(cell_t *ptr, size_t count)
|
||||
{
|
||||
m_CellRecipients = ptr;
|
||||
m_Size = count;
|
||||
}
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_CELLRECIPIENTFILTER_H_
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Version="8,00"
|
||||
Name="sourcemod_mm"
|
||||
ProjectGUID="{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
|
||||
RootNamespace="sourcemod_mm"
|
||||
@ -269,10 +269,18 @@
|
||||
RelativePath="..\CDbgReporter.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CellRecipientFilter.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CLogger.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CMsgIdPool.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\CPlayerManager.h"
|
||||
>
|
||||
@ -633,6 +641,10 @@
|
||||
RelativePath="..\smn_admin.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\smn_bitbuffer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\smn_console.cpp"
|
||||
>
|
||||
@ -669,6 +681,10 @@
|
||||
RelativePath="..\smn_textparse.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\smn_usermsgs.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
348
core/smn_bitbuffer.cpp
Normal file
348
core/smn_bitbuffer.cpp
Normal file
@ -0,0 +1,348 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* ===============================================================
|
||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||
* ===============================================================
|
||||
*
|
||||
* This file is not open source and may not be copied without explicit
|
||||
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||
* in whole or significant part.
|
||||
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||
*
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#include <bitbuf.h>
|
||||
#include <vector.h>
|
||||
#include "sourcemod.h"
|
||||
#include "HandleSys.h"
|
||||
|
||||
static cell_t smn_BfWriteBool(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteOneBit(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteByte(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteByte(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteChar(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteChar(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteShort(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteShort(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteWord(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteWord(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteNum(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteLong(static_cast<long>(params[2]));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteFloat(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteFloat(sp_ctof(params[2]));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteString(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
int err;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
char *str;
|
||||
if ((err=pCtx->LocalToString(params[2], &str)) != SP_ERROR_NONE)
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(err, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pBitBuf->WriteString(str);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteEntity(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteShort(params[2]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteAngle(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteBitAngle(sp_ctof(params[2]), params[3]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteCoord(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
pBitBuf->WriteBitCoord(sp_ctof(params[2]));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteVecCoord(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
cell_t *pVec;
|
||||
pCtx->LocalToPhysAddr(params[2], &pVec);
|
||||
Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
|
||||
pBitBuf->WriteBitVec3Coord(vec);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteVecNormal(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
cell_t *pVec;
|
||||
pCtx->LocalToPhysAddr(params[2], &pVec);
|
||||
Vector vec(sp_ctof(pVec[0]), sp_ctof(pVec[1]), sp_ctof(pVec[2]));
|
||||
pBitBuf->WriteBitVec3Normal(vec);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell_t smn_BfWriteAngles(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
Handle_t hndl = static_cast<Handle_t>(params[1]);
|
||||
HandleError herr;
|
||||
HandleSecurity sec;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
sec.pOwner = NULL;
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
|
||||
if ((herr=g_HandleSys.ReadHandle(hndl, g_WrBitBufType, &sec, (void **)&pBitBuf))
|
||||
!= HandleError_None)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid bit buffer handle %x (error %d)", hndl, herr);
|
||||
}
|
||||
|
||||
cell_t *pAng;
|
||||
pCtx->LocalToPhysAddr(params[2], &pAng);
|
||||
QAngle ang(sp_ctof(pAng[0]), sp_ctof(pAng[1]), sp_ctof(pAng[2]));
|
||||
pBitBuf->WriteBitAngles(ang);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
REGISTER_NATIVES(wrbitbufnatives)
|
||||
{
|
||||
{"BfWriteBool", smn_BfWriteBool},
|
||||
{"BfWriteByte", smn_BfWriteByte},
|
||||
{"BfWriteChar", smn_BfWriteChar},
|
||||
{"BfWriteShort", smn_BfWriteShort},
|
||||
{"BfWriteWord", smn_BfWriteWord},
|
||||
{"BfWriteNum", smn_BfWriteNum},
|
||||
{"BfWriteFloat", smn_BfWriteFloat},
|
||||
{"BfWriteString", smn_BfWriteString},
|
||||
{"BfWriteEntity", smn_BfWriteEntity},
|
||||
{"BfWriteAngle", smn_BfWriteAngle},
|
||||
{"BfWriteCoord", smn_BfWriteCoord},
|
||||
{"BfWriteVecCoord", smn_BfWriteVecCoord},
|
||||
{"BfWriteVecNormal", smn_BfWriteVecNormal},
|
||||
{"BfWriteAngles", smn_BfWriteAngles},
|
||||
{NULL, NULL}
|
||||
};
|
190
core/smn_usermsgs.cpp
Normal file
190
core/smn_usermsgs.cpp
Normal file
@ -0,0 +1,190 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* ===============================================================
|
||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||
* ===============================================================
|
||||
*
|
||||
* This file is not open source and may not be copied without explicit
|
||||
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||
* in whole or significant part.
|
||||
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||
*
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#include "HandleSys.h"
|
||||
#include "CellRecipientFilter.h"
|
||||
#include "CMsgIdPool.h"
|
||||
|
||||
#define USERMSG_PASSTHRU (1<<0)
|
||||
#define USERMSG_PASSTHRU_ALL (1<<1)
|
||||
#define USERMSG_RELIABLE (1<<2)
|
||||
#define USERMSG_INITMSG (1<<3)
|
||||
|
||||
CMessageIdPool g_MessageIds;
|
||||
CellRecipientFilter g_MsgRecFilter;
|
||||
HandleType_t g_WrBitBufType;
|
||||
Handle_t g_CurMsgHandle;
|
||||
bool g_IsMsgInExec = false;
|
||||
int g_CurMsgFlags = 0;
|
||||
|
||||
class UsrMessageNatives :
|
||||
public SMGlobalClass,
|
||||
public IHandleTypeDispatch
|
||||
{
|
||||
public:
|
||||
void OnSourceModAllInitialized()
|
||||
{
|
||||
g_WrBitBufType = g_HandleSys.CreateType("BitBufWriter", this, 0, NULL, NULL, g_pCoreIdent, NULL);
|
||||
}
|
||||
void OnSourceModShutdown()
|
||||
{
|
||||
g_HandleSys.RemoveType(g_WrBitBufType, g_pCoreIdent);
|
||||
g_WrBitBufType = 0;
|
||||
}
|
||||
void OnHandleDestroy(HandleType_t type, void *object)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
static cell_t smn_GetUserMessageId(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
char *msgname;
|
||||
int err;
|
||||
if ((err=pCtx->LocalToString(params[1], &msgname)) != SP_ERROR_NONE)
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(err, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return g_MessageIds.GetMessageId(msgname);
|
||||
}
|
||||
|
||||
static cell_t smn_StartMessage(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
char *msgname;
|
||||
cell_t *cl_array;
|
||||
int msgid, err;
|
||||
bf_write *pBitBuf;
|
||||
|
||||
if (g_IsMsgInExec)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Unable to execute a new message, there is already one in progress");
|
||||
}
|
||||
|
||||
if ((err=pCtx->LocalToString(params[1], &msgname)) != SP_ERROR_NONE)
|
||||
{
|
||||
pCtx->ThrowNativeErrorEx(err, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((msgid=g_MessageIds.GetMessageId(msgname)) == INVALID_MESSAGE_ID)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid message name: \"%s\"", msgname);
|
||||
}
|
||||
|
||||
pCtx->LocalToPhysAddr(params[2], &cl_array);
|
||||
g_CurMsgFlags = params[4];
|
||||
|
||||
g_MsgRecFilter.SetRecipientPtr(cl_array, params[3]);
|
||||
if (g_CurMsgFlags & USERMSG_INITMSG)
|
||||
{
|
||||
g_MsgRecFilter.SetInitMessage(true);
|
||||
}
|
||||
if (g_CurMsgFlags & USERMSG_RELIABLE)
|
||||
{
|
||||
g_MsgRecFilter.SetReliable(true);
|
||||
}
|
||||
|
||||
if (g_CurMsgFlags & (USERMSG_PASSTHRU_ALL|USERMSG_PASSTHRU)) //:TODO: change this when we can hook messages
|
||||
{
|
||||
pBitBuf = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&g_MsgRecFilter), msgid);
|
||||
} else {
|
||||
pBitBuf = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&g_MsgRecFilter), msgid);
|
||||
}
|
||||
|
||||
g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL);
|
||||
g_IsMsgInExec = true;
|
||||
|
||||
return g_CurMsgHandle;
|
||||
}
|
||||
|
||||
static cell_t smn_StartMessageEx(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
cell_t *cl_array;
|
||||
bf_write *pBitBuf;
|
||||
int msgid = params[1];
|
||||
|
||||
if (g_IsMsgInExec)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Unable to execute a new message, there is already one in progress");
|
||||
}
|
||||
|
||||
if (msgid < 0 || msgid > 255)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Invalid message id supplied (%d)", msgid);
|
||||
}
|
||||
|
||||
pCtx->LocalToPhysAddr(params[2], &cl_array);
|
||||
g_CurMsgFlags = params[4];
|
||||
|
||||
g_MsgRecFilter.SetRecipientPtr(cl_array, params[3]);
|
||||
if (g_CurMsgFlags & USERMSG_INITMSG)
|
||||
{
|
||||
g_MsgRecFilter.SetInitMessage(true);
|
||||
}
|
||||
if (g_CurMsgFlags & USERMSG_RELIABLE)
|
||||
{
|
||||
g_MsgRecFilter.SetReliable(true);
|
||||
}
|
||||
|
||||
if (g_CurMsgFlags & (USERMSG_PASSTHRU_ALL|USERMSG_PASSTHRU)) //:TODO: change this when we can hook messages
|
||||
{
|
||||
pBitBuf = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&g_MsgRecFilter), msgid);
|
||||
} else {
|
||||
pBitBuf = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&g_MsgRecFilter), msgid);
|
||||
}
|
||||
|
||||
g_CurMsgHandle = g_HandleSys.CreateHandle(g_WrBitBufType, pBitBuf, pCtx->GetIdentity(), g_pCoreIdent, NULL);
|
||||
g_IsMsgInExec = true;
|
||||
|
||||
return g_CurMsgHandle;
|
||||
}
|
||||
|
||||
static cell_t smn_EndMessage(IPluginContext *pCtx, const cell_t *params)
|
||||
{
|
||||
HandleSecurity sec;
|
||||
|
||||
if (!g_IsMsgInExec)
|
||||
{
|
||||
return pCtx->ThrowNativeError("Unable to end message, no message is in progress");
|
||||
}
|
||||
|
||||
if (g_CurMsgFlags & (USERMSG_PASSTHRU_ALL|USERMSG_PASSTHRU))
|
||||
{
|
||||
engine->MessageEnd();
|
||||
} else {
|
||||
ENGINE_CALL(MessageEnd)();
|
||||
}
|
||||
|
||||
sec.pOwner = pCtx->GetIdentity();
|
||||
sec.pIdentity = g_pCoreIdent;
|
||||
g_HandleSys.FreeHandle(g_CurMsgHandle, &sec);
|
||||
|
||||
g_IsMsgInExec = false;
|
||||
g_CurMsgFlags = 0;
|
||||
g_MsgRecFilter.ResetFilter();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static UsrMessageNatives s_UsrMessageNatives;
|
||||
|
||||
REGISTER_NATIVES(usrmsgnatives)
|
||||
{
|
||||
{"GetUserMessageId", smn_GetUserMessageId},
|
||||
{"StartMessage", smn_StartMessage},
|
||||
{"StartMessageEx", smn_StartMessageEx},
|
||||
{"EndMessage", smn_EndMessage},
|
||||
{NULL, NULL}
|
||||
};
|
@ -101,5 +101,6 @@ private:
|
||||
};
|
||||
|
||||
extern SourceModBase g_SourceMod;
|
||||
extern HandleType_t g_WrBitBufType;
|
||||
|
||||
#endif //_INCLUDE_SOURCEMOD_GLOBALHEADER_H_
|
||||
|
@ -13,48 +13,10 @@
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#if defined _eventsmsgs_included
|
||||
#if defined _bitbuffer_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _eventsmsgs_included
|
||||
|
||||
enum UserMsg
|
||||
{
|
||||
INVALID_MESSAGE_ID = -1,
|
||||
};
|
||||
|
||||
#define USERMSG_PASSTHRU (1<<0) /**< Message will pass through other SourceMM plugins */
|
||||
#define USERMSG_PASSTHRU_ALL (1<<1) /**< Message will pass through other SourceMM plugins AND SourceMod */
|
||||
|
||||
//:NOTE: none of this is implemented yet, remove this notice and add to sourcemod.inc once it's done!
|
||||
//:NOTE: for DS, add main event natives below EndMessage but above bf_ stuff
|
||||
|
||||
/**
|
||||
* Returns the ID of a given message, or -1 on failure.
|
||||
*
|
||||
* @param msg String containing message name (case sensitive).
|
||||
* @return A message index, or INVALID_MESSAGE_ID on failure.
|
||||
*/
|
||||
native UserMsg:GetUserMessageId(const String:msg[]);
|
||||
|
||||
/**
|
||||
* Starts a usermessage (network message).
|
||||
* @note Only one message can be active at a time.
|
||||
*
|
||||
* @param msg Message index to start.
|
||||
* @param clients Array containing player indexes to broadcast to.
|
||||
* @param numClients Number of players in the array.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
native Handle:StartMessage(UserMsg:msg, clients[], numClients, flags);
|
||||
|
||||
/**
|
||||
* Ends a previously started user message (network message).
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
native EndMessage();
|
||||
#define _bitbuffer_included
|
||||
|
||||
/**
|
||||
* Writes a single bit to a writable bitbuffer (bf_write).
|
||||
@ -197,44 +159,3 @@ native BfWriteVecNormal(Handle:bf, Float:vec[3]);
|
||||
* @error Invalid or incorrect Handle.
|
||||
*/
|
||||
native BfWriteAngles(Handle:bf, Float:angles[3]);
|
||||
|
||||
/**
|
||||
* Starts a usermessage (network message) that broadcasts to all clients.
|
||||
*
|
||||
* @param msg Message index to start.
|
||||
* @param flags Optional flags to set.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
stock Handle:StartMessageAll(UserMsg:msg, flags=0)
|
||||
{
|
||||
new maxClients = GetMaxClients();
|
||||
new total = 0;
|
||||
new clients[maxClients];
|
||||
for (new i=1; i<=maxClients; i++)
|
||||
{
|
||||
if (IsClientConnected(i))
|
||||
{
|
||||
clients[total++] = i;
|
||||
}
|
||||
}
|
||||
return StartMessage(msg, clients, total, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a simpler usermessage (network message) for one client.
|
||||
*
|
||||
* @param msg Message index to start.
|
||||
* @param client Client to send to.
|
||||
* @param flags Optional flags to set.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
stock Handle:StartMessageOne(UserMsg:msg, client, flags=0)
|
||||
{
|
||||
new players[1];
|
||||
|
||||
players[0] = client;
|
||||
|
||||
return StartMsesage(msg, players, 1, flags);
|
||||
}
|
@ -34,6 +34,8 @@ struct Plugin
|
||||
#include <admin>
|
||||
#include <files>
|
||||
#include <console>
|
||||
#include <usermessages>
|
||||
#include <bitbuffer>
|
||||
|
||||
/**
|
||||
* Declare this as a struct in your plugin to expose its information.
|
||||
|
109
plugins/include/usermessages.inc
Normal file
109
plugins/include/usermessages.inc
Normal file
@ -0,0 +1,109 @@
|
||||
/**
|
||||
* vim: set ts=4 :
|
||||
* ===============================================================
|
||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||
* ===============================================================
|
||||
*
|
||||
* This file is part of the SourceMod/SourcePawn SDK. This file may only be used
|
||||
* or modified under the Terms and Conditions of its License Agreement, which is found
|
||||
* in LICENSE.txt. The Terms and Conditions for making SourceMod extensions/plugins
|
||||
* may change at any time. To view the latest information, see:
|
||||
* http://www.sourcemod.net/license.php
|
||||
*
|
||||
* Version: $Id$
|
||||
*/
|
||||
|
||||
#if defined _eventsmsgs_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _eventsmsgs_included
|
||||
|
||||
enum UserMsg
|
||||
{
|
||||
INVALID_MESSAGE_ID = -1,
|
||||
};
|
||||
|
||||
#define USERMSG_PASSTHRU (1<<0) /**< Message will pass through other SourceMM plugins */
|
||||
#define USERMSG_PASSTHRU_ALL (1<<1) /**< Message will pass through other SourceMM plugins AND SourceMod */
|
||||
#define USERMSG_RELIABLE (1<<2) /**< Message will be set to reliable */
|
||||
#define USERMSG_INITMSG (1<<3) /**< Message will be considered to be an initmsg */
|
||||
|
||||
/**
|
||||
* Returns the ID of a given message, or -1 on failure.
|
||||
*
|
||||
* @param msg String containing message name (case sensitive).
|
||||
* @return A message index, or INVALID_MESSAGE_ID on failure.
|
||||
*/
|
||||
native UserMsg:GetUserMessageId(const String:msg[]);
|
||||
|
||||
/**
|
||||
* Starts a usermessage (network message).
|
||||
* @note Only one message can be active at a time.
|
||||
*
|
||||
* @param msgname Message name to start.
|
||||
* @param clients Array containing player indexes to broadcast to.
|
||||
* @param numClients Number of players in the array.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
native Handle:StartMessage(String:msgname[], clients[], numClients, flags);
|
||||
|
||||
/**
|
||||
* Starts a usermessage (network message).
|
||||
* @note Only one message can be active at a time.
|
||||
*
|
||||
* @param msg Message index to start.
|
||||
* @param clients Array containing player indexes to broadcast to.
|
||||
* @param numClients Number of players in the array.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
native Handle:StartMessageEx(UserMsg:msg, clients[], numClients, flags);
|
||||
|
||||
/**
|
||||
* Ends a previously started user message (network message).
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
native EndMessage();
|
||||
|
||||
/**
|
||||
* Starts a usermessage (network message) that broadcasts to all clients.
|
||||
*
|
||||
* @param msgname Message name to start.
|
||||
* @param flags Optional flags to set.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
stock Handle:StartMessageAll(String:msgname[], flags=0)
|
||||
{
|
||||
new maxClients = GetMaxClients();
|
||||
new total = 0;
|
||||
new clients[maxClients];
|
||||
for (new i=1; i<=maxClients; i++)
|
||||
{
|
||||
if (IsClientConnected(i))
|
||||
{
|
||||
clients[total++] = i;
|
||||
}
|
||||
}
|
||||
return StartMessage(msgname, clients, total, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a simpler usermessage (network message) for one client.
|
||||
*
|
||||
* @param msgname Message name to start.
|
||||
* @param client Client to send to.
|
||||
* @param flags Optional flags to set.
|
||||
* @return A handle to a bf_write bit packing structure, or
|
||||
* INVALID_HANDLE on failure.
|
||||
*/
|
||||
stock Handle:StartMessageOne(String:msgname[], client, flags=0)
|
||||
{
|
||||
new players[1];
|
||||
|
||||
players[0] = client;
|
||||
|
||||
return StartMessage(msgname, players, 1, flags);
|
||||
}
|
Loading…
Reference in New Issue
Block a user