Скриптер
Моделлер
Участник
Пользователь
- Сообщения
- 845
- Реакции
- 523
- Помог
- 13 раз(а)
Нумерация объектов для их дальнейшей идентификации
Например, когда объекты нужно запихнуть в дин.массив для дальнейшей работы с этими объектами. В течении времени, после того как мы поместили объект в пул, с ним может произойти все что угодно. Поэтому в этом случае объекты лучше проиндексировать. Здесь я использую iuser4 для метки.
В следующем плагине используем нашу метку для идентификации
В боевом варианте с этим же примером, этот пул шапок можно копировать на фейковые модели игрока (плагины DanceMenu и т.д.), дабы отображать шапочки и на фейках.
Например, когда объекты нужно запихнуть в дин.массив для дальнейшей работы с этими объектами. В течении времени, после того как мы поместили объект в пул, с ним может произойти все что угодно. Поэтому в этом случае объекты лучше проиндексировать. Здесь я использую iuser4 для метки.
PHP:
#include <amxmodx>
#include <reapi>
new g_iKeyCounter = 1; // счетчик для нумерации объектов
public plugin_init() {
RegisterHookChain(RH_ED_Alloc, "fw_Edict_Alloc", true);
RegisterHookChain(RH_ED_Free, "fw_Edict_Free", false);
}
// удаление объекта
public fw_Edict_Free(iEnt)
{
server_print("Remove entity(free) %d (%s) | iKey = %d", iEnt, !is_nullent(iEnt) ? "valid" : "invalid", get_entvar(iEnt, var_iuser4));
}
// Выделение памяти под объект, все еще невалидный
public fw_Edict_Alloc()
{
new iEnt = GetHookChainReturn(ATYPE_INTEGER);
server_print("Created entity %d (%s)", iEnt, !is_nullent(iEnt) ? "valid" : "invalid");
RequestFrame("@fw_NextFrame_CreateEntity", iEnt);
}
// на следующем кадре сервера проверяем что объект валидный и ставим ему метку
@fw_NextFrame_CreateEntity(iEnt)
{
// Нумеруем объект, чтобы использовать номер как идентификатор
if (!is_nullent(iEnt)) {
new szClassName[32];
get_entvar(iEnt, var_classname, szClassName, 31);
server_print("Check entity %d [%s] | iKey = %d", iEnt, szClassName, g_iKeyCounter);
set_entvar(iEnt, var_iuser4, g_iKeyCounter);
g_iKeyCounter++;
}
}
Код:
#include <amxmodx>
#include <reapi>
#include <fakemeta>
enum aArrData {
aArrData_pIndex,
aArrData_pOwner,
aArrData_iKey
}
new Array:g_aArrayData;
public plugin_init()
{
g_aArrayData = ArrayCreate(aArrData);
}
public RemoveHat(id) {
new pHat;
if (is_user_alive(id)) {
pHat = FindUserHat(id);
if (!is_nullent(pHat)) {
set_entvar(pHat, var_flags, FL_KILLME);
}
}
}
public CreateHat(id)
{
new pHat;
if (is_user_alive(id)) {
pHat = rg_create_entity("info_target");
if (!is_nullent(pHat)) {
set_entvar(pHat, var_classname, "hats");
engfunc(EngFunc_SetModel, pHat, "models/p_ak47.mdl");
set_entvar(pHat, var_owner, id);
set_entvar(pHat, var_aiment, id);
set_entvar(pHat, var_movetype, MOVETYPE_FOLLOW);
new szData[aArrData];
szData[aArrData_pIndex] = pHat;
szData[aArrData_iKey] = get_entvar(pHat, var_iuser4);
szData[aArrData_pOwner] = get_entvar(pHat, var_owner);
ArrayPushArray(g_aArrayData, szData);
}
}
}
stock FindUserHat(id)
{
for (new i, szData[aArrData], pIndex; i<ArraySize(g_aArrayData); i++) {
ArrayGetArray(g_aArrayData, i, szData);
pIndex = szData[aArrData_pIndex];
// Если данные объекта из массива не совпадают с самим объектом, тогда очищаем этот элемент [это говорит о том, что объект подчищен или изменен]
if (is_nullent(pIndex) || get_entvar(pIndex, var_owner) != szData[aArrData_pOwner] || szData[aArrData_iKey] != get_entvar(pIndex, var_iuser4)) {
ArrayDeleteItem(g_aArrayData, i--);
continue;
}
if (szData[aArrData_pOwner] == id) {
return pIndex;
}
}
return FM_NULLENT;
}