Synced bcompat tree additions and fixes found so far
This commit is contained in:
@ -256,9 +256,9 @@ int CLangMngr::GetKeyEntry(const char *key)
|
||||
return val.index;
|
||||
}
|
||||
|
||||
int CLangMngr::AddKeyEntry(String &key)
|
||||
int CLangMngr::AddKeyEntry(const char *key)
|
||||
{
|
||||
keytbl_val val;
|
||||
keytbl_val val;
|
||||
val.index = static_cast<int>(KeyList.size());
|
||||
|
||||
String *pString = new String(key);
|
||||
@ -269,6 +269,11 @@ int CLangMngr::AddKeyEntry(String &key)
|
||||
return val.index;
|
||||
}
|
||||
|
||||
int CLangMngr::AddKeyEntry(String &key)
|
||||
{
|
||||
return AddKeyEntry(key.c_str());
|
||||
}
|
||||
|
||||
int CLangMngr::GetKeyEntry(String &key)
|
||||
{
|
||||
keytbl_val &val = KeyTable[key];
|
||||
|
@ -127,9 +127,11 @@ class CLangMngr
|
||||
public:
|
||||
void AddEntry(int key, const char *definition);
|
||||
};
|
||||
|
||||
public:
|
||||
// Merge definitions into a language
|
||||
void MergeDefinitions(const char *lang, CQueue <sKeyDef> &tmpVec);
|
||||
|
||||
private:
|
||||
// strip lowercase; make lower if needed
|
||||
static size_t strip(char *str, char *newstr, bool makelower = false);
|
||||
|
||||
@ -160,11 +162,11 @@ public:
|
||||
// Get index
|
||||
int GetKeyEntry(String &key);
|
||||
int GetKeyEntry(const char *key);
|
||||
int GetKeyIndex(const char *key);
|
||||
// Get key from index
|
||||
const char *GetKey(int key);
|
||||
// Add key
|
||||
int AddKeyEntry(String &key);
|
||||
int AddKeyEntry(const char *key);
|
||||
|
||||
// Get the number of languages
|
||||
int GetLangsNum();
|
||||
|
Binary file not shown.
Binary file not shown.
@ -990,6 +990,7 @@ int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code)
|
||||
amx->cip = hdr->cip;
|
||||
amx->hea = hdr->hea;
|
||||
amx->stp = hdr->stp - sizeof(cell);
|
||||
amx->hlw = hdr->hea;
|
||||
/* also put a sentinel for strings at the top the stack */
|
||||
*(cell *)((char*)native_code + hdr->dat + hdr->stp - sizeof(cell)) = 0;
|
||||
amx->stk = amx->stp;
|
||||
|
@ -322,6 +322,7 @@ enum {
|
||||
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
||||
#define AMX_FLAG_BYTEOPC 0x08 /* opcode is a byte (not a cell) */
|
||||
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking; no STMT opcode */
|
||||
#define AMX_FLAG_OLDFILE 0x20 /* Old AMX Mod plugin */
|
||||
#define AMX_FLAG_PRENIT 0x100 /* pre-initialized, do not check natives */
|
||||
#define AMX_FLAG_NTVREG 0x1000 /* all native functions are registered */
|
||||
#define AMX_FLAG_JITC 0x2000 /* abstract machine is JIT compiled */
|
||||
|
@ -2122,7 +2122,9 @@ err_heaplow:
|
||||
_CHKMARGIN_HEAP:
|
||||
cmp esi,stp
|
||||
jg err_stacklow
|
||||
cmp dword hea,0
|
||||
mov ebp,amx
|
||||
mov ebp,[ebp+_hlw]
|
||||
cmp dword hea,ebp
|
||||
jl err_heaplow
|
||||
ret
|
||||
|
||||
|
@ -4076,6 +4076,40 @@ static cell AMX_NATIVE_CALL amxx_setpl_curweap(AMX *amx, cell *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL CreateLangKey(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
const char *key = get_amxstring(amx, params[1], 0, len);
|
||||
int suki = g_langMngr.GetKeyEntry(key);
|
||||
|
||||
if (suki != -1)
|
||||
{
|
||||
return suki;
|
||||
}
|
||||
|
||||
return g_langMngr.AddKeyEntry(key);
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL AddTranslation(AMX *amx, cell *params)
|
||||
{
|
||||
int len;
|
||||
const char *lang = get_amxstring(amx, params[1], 0, len);
|
||||
int suki = params[2];
|
||||
const char *phrase = get_amxstring(amx, params[3], 1, len);
|
||||
|
||||
CQueue<sKeyDef> queue;
|
||||
sKeyDef def;
|
||||
|
||||
def.definition = new String(phrase);
|
||||
def.key = suki;
|
||||
|
||||
queue.push(def);
|
||||
|
||||
g_langMngr.MergeDefinitions(lang, queue);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||
{
|
||||
{"abort", amx_abort},
|
||||
@ -4255,8 +4289,10 @@ AMX_NATIVE_INFO amxmodx_Natives[] =
|
||||
{"user_kill", user_kill},
|
||||
{"user_slap", user_slap},
|
||||
{"xvar_exists", xvar_exists},
|
||||
{"AddTranslation", AddTranslation},
|
||||
{"ClearSyncHud", ClearSyncHud},
|
||||
{"CreateHudSyncObj", CreateHudSyncObj},
|
||||
{"CreateLangKey", CreateLangKey},
|
||||
{"CreateMultiForward", CreateMultiForward},
|
||||
{"CreateOneForward", CreateOneForward},
|
||||
{"DestroyForward", DestroyForward},
|
||||
|
@ -92,6 +92,7 @@ public:
|
||||
Error GetStatus(); // Get the current status
|
||||
size_t GetBufferSize(); // Get the size for the buffer
|
||||
Error GetSection(void *buffer); // Copy the currently selected section to the buffer
|
||||
inline bool IsOldFile() const { return m_OldFile; }
|
||||
};
|
||||
|
||||
#endif // __AMXXFILE_H__
|
||||
|
@ -9,6 +9,8 @@
|
||||
|
||||
#define MAX_MESSAGES 255
|
||||
|
||||
#define MSGBLOCK_SET 0
|
||||
#define MSGBLOCK_GET 1
|
||||
#define BLOCK_NOT 0
|
||||
#define BLOCK_ONCE 1
|
||||
#define BLOCK_SET 2
|
||||
|
@ -1742,6 +1742,33 @@ const char *MNF_GetLocalInfo(char *name, const char *def)
|
||||
return get_localinfo(name, def);
|
||||
}
|
||||
|
||||
void MNF_MessageBlock(int mode, int msg, int *opt)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case MSGBLOCK_SET:
|
||||
{
|
||||
if (msg < 0 || msg > MAX_MESSAGES || opt == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int _opt = msgBlocks[msg];
|
||||
msgBlocks[msg] = *opt;
|
||||
*opt = _opt;
|
||||
break;
|
||||
}
|
||||
case MSGBLOCK_GET:
|
||||
{
|
||||
if (msg < 0 || msg > MAX_MESSAGES || opt == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
*opt = msgBlocks[msg];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *MNF_PlayerPropAddr(int id, int prop)
|
||||
{
|
||||
if (id < 1 || id > gpGlobals->maxClients)
|
||||
@ -1891,6 +1918,8 @@ void Module_CacheFunctions()
|
||||
REGISTER_FUNC("OverrideNatives", MNF_OverrideNatives);
|
||||
REGISTER_FUNC("GetLocalInfo", MNF_GetLocalInfo);
|
||||
|
||||
REGISTER_FUNC("MessageBlock", MNF_MessageBlock);
|
||||
|
||||
#ifdef MEMORY_TEST
|
||||
REGISTER_FUNC("Allocator", m_allocator)
|
||||
REGISTER_FUNC("Deallocator", m_deallocator)
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include "natives.h"
|
||||
#include "debugger.h"
|
||||
#include "libraries.h"
|
||||
#include "format.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <malloc.h>
|
||||
@ -98,7 +99,7 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params)
|
||||
{
|
||||
amx_Push(pNative->amx, numParams);
|
||||
amx_Push(pNative->amx, pPlugin->getId());
|
||||
for (int i=numParams; i>=1; i--)
|
||||
for (int i=numParams; i>=0; i--)
|
||||
pNative->params[i] = params[i];
|
||||
} else if (pNative->style == 1) {
|
||||
//use dJeyL's system .. very clever!
|
||||
@ -328,6 +329,70 @@ static cell AMX_NATIVE_CALL set_array(AMX *amx, cell *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static cell AMX_NATIVE_CALL vdformat(AMX *amx, cell *params)
|
||||
{
|
||||
if (!g_NativeStack.size())
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Not currently in a dynamic native");
|
||||
return 0;
|
||||
}
|
||||
|
||||
regnative *pNative = g_NativeStack.front();
|
||||
|
||||
if (pNative->style)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Wrong style of dynamic native");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vargPos = static_cast<int>(params[4]);
|
||||
int fargPos = static_cast<int>(params[3]);
|
||||
|
||||
/** get the parent parameter array */
|
||||
cell *local_params = pNative->params;
|
||||
|
||||
cell max = local_params[0] / sizeof(cell);
|
||||
if (vargPos > (int)max + 1)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid vararg parameter passed: %d", vargPos);
|
||||
return 0;
|
||||
}
|
||||
if (fargPos > (int)max + 1)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Invalid fmtarg parameter passed: %d", fargPos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* get destination info */
|
||||
cell *fmt;
|
||||
if (fargPos == 0)
|
||||
{
|
||||
if (params[0] / sizeof(cell) != 5)
|
||||
{
|
||||
LogError(amx, AMX_ERR_NATIVE, "Expected fmtarg as fifth parameter, found none");
|
||||
return 0;
|
||||
}
|
||||
fmt = get_amxaddr(amx, params[5]);
|
||||
} else {
|
||||
fmt = get_amxaddr(pNative->caller, pNative->params[fargPos]);
|
||||
}
|
||||
cell *realdest = get_amxaddr(amx, params[1]);
|
||||
size_t maxlen = static_cast<size_t>(params[2]);
|
||||
cell *dest = realdest;
|
||||
|
||||
/* if this is necessary... */
|
||||
static cell cpbuf[4096];
|
||||
dest = cpbuf;
|
||||
|
||||
/* perform format */
|
||||
size_t total = atcprintf(dest, maxlen, fmt, pNative->caller, local_params, &vargPos);
|
||||
|
||||
/* copy back */
|
||||
memcpy(realdest, dest, (total+1) * sizeof(cell));
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
//This is basically right from dJeyL's lib_convert function
|
||||
//This awesome hack modifies the stack frame to have an address offset
|
||||
// that will align to the other plugin's memory.
|
||||
@ -444,6 +509,7 @@ AMX_NATIVE_INFO g_NativeNatives[] = {
|
||||
{"set_float_byref", set_param_byref},
|
||||
{"get_array_f", get_array},
|
||||
{"set_array_f", set_array},
|
||||
{"vdformat", vdformat},
|
||||
{"param_convert", param_convert},
|
||||
//////////////////////////
|
||||
{NULL, NULL},
|
||||
|
Reference in New Issue
Block a user