Переменные

Сообщения
58
Реакции
2
Помог
2 раз(а)
Добрый день. Интересует вопрос, как хранить информацию в объекте, то есть параметры и свойства.
Создавать массив для каждого
new kills[1000]
или
set_entvar(this, var_iuser1, get_entvar(this, var_iuser1) )
Как лучше это реализовать? Если таких куча и iuser, euser не достаточно

UPD:
неужели сложный вопрос?

некоторые значения изменются в течении секунды около 10 раз и таких объектов не мало
 
Последнее редактирование:
Сообщения
58
Реакции
2
Помог
2 раз(а)
Попробую утонить.
Плагин создает объекты. Например турель из Half-life.
Необходимо записывать количество убитых ею противников.
Записать его уровень.
Количество патронов.
В какую сторону поворачить в режиме ожидания его верхнуюю часть, то есть влево или вправо. Значения 1 и 0 или bool
К какой команде принадлежит этот объект.
Статус объекта. Активен. В ожидании активации. Уничтожен.
И ещё кучу всякий параметров
 

Garey

ninjaCow
Сообщения
422
Реакции
1,056
Помог
10 раз(а)
pro100iweb, можно использовать дин массив а лучше такое переписать в мета-модуль. Где можно создать класс и хоть 100500 полей добавить...
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
pro100iweb, тут вектор структур нужен по хорошему хД
Вообще если известно, что количество турелей до n, то можно в enum "струкутре" хранить данные.
Что-то вроде:
Код:
enum TURRET_DATA
{
   kills,
   status,
   some_value,
   second_some_value
   //...
};

new g_eTurrets[n][TURRET_DATA];
 
Сообщения
58
Реакции
2
Помог
2 раз(а)
irrumabo_me_nomen, в последнее время у меня с этим были проблемы, не пойму почему, но сервер падал
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Как вариант: в var_iuser1 ты можешь хранить указатель на Array и в него сохранять все нужные тебе данные:

C:
enum _:STRUCT_TURRET
{
    TURRET_KILLS,
    TURRET_LEVEL,
    TURRET_STRING,
    TURRET_ARRAY
}

// Инициализируем данные
new Array:aTurret = ArrayCreate(32); // Где 32 — максимальный размер каждой ячейки. Здесь надо иметь ввиду, что если в струтуре пристутствуют строки или массивы, то надо указать самую большую размерность
ArrayPushCell(aTurret, 1337);
ArrayPushCell(aTurret, 2);
ArrayPushString(aTurret, "turret_name");
ArrayPushArray(aTurret, {0, 1, 2, 3, 4, 5});

set_entvar(this, var_iuser1, aTurret);

// Получаем данные
new Array:aTurret = Array:get_entvar(this, var_iuser1);

new iKills = ArrayGetCell(aTurret, TURRET_KILLS)
new iLevel = ArrayGetCell(aTurret, TURRET_LEVEL)
new szTurretName[32]; ArrayGetString(aTurret, TURRET_STRING, szTurretName, charsmax(szTurretName))
new iTurretArray[5]; ArrayGetArray(aTurret, TURRET_ARRAY, iArray, sizeof(iArray))
Самый извращенный способ. Но есть более удобный:

Код:
enum _:STRUCT_TURRET
{
    TURRET_KILLS,
    TURRET_LEVEL,
    TURRET_NAME[32],
    TURRET_ARRAY[5]
}

// Инициализируем даннные. Здесь можно их заполнить позже, минув стадию заполнения струтуры
new Array:aTurret = ArrayCreate(STRUCT_TURRET), eTurret[STRUCT_TURRET]
eTurret[TURRET_KILLS] = 1337
eTurret[TURRET_LEVEL] = 2
copy(eTurret[TURRET_NAME], charsmax(eTurret[TURRET_NAME]), "turret_name")
eTurret[TURRET_ARRAY] = {0, 1, 2, 3, 4}
ArrayPushArray(aTurret, eTurret)
set_entvar(this, var_iuser1, eTurret)

// Получаем данные
new eTurret[STRUCT_TURRET]; ArrayGetArray(Array:get_entvar(this, var_iuser1), 0, eTurret);
// Теперь eTurret хранит всю струтуру турели
Инициализацию и получение структуры можно завернуть в функции и это станет еще удобнее
8 Мар 2020
некоторые значения изменются в течении секунды около 10 раз и таких объектов не мало
В этом случае лучше найти специальное поле в entvars для таких переменных, а так как это применяется к кастомному объекту, то свободных полей для таких целей полно
 
Сообщения
58
Реакции
2
Помог
2 раз(а)
Xelson, спасибо за помощь, но всё не то, очень много лишнего придеться дергать. Думаю останусь при своём исполнении, так как это намного быстрее, хотя придеться жертвовать памятью )

Код:
new SentryThinkTime[1000]   // через сколько запустить цикл проверки видимости игроков
new RocketThinkTime[1000]             // готовность ракет
new RocketFires[1000]                      // количество ракет выпускаемых пушкой
new SentryTurnTarget[1000][2]         // поворот и наклон пушки при захвате цели
new SentryTurnTargetThink[1000]    // скорость вращения пушки
new SentryTarget[1000]                    // захваченная цель,ID игрока
new SentryNextUPDTime[1000]       // через сколько секунд возможно улучшить пушку
new SentryKills[1000]                       // количество убийств пушкой
Конечно можно в enum. Может я где то накосячил или была друга причина, но тогда из-за этого падал сервер, разделил и падения прекратились
 

Ayk

Сообщения
763
Реакции
478
Помог
19 раз(а)
pro100iweb, попробуй: https://github.com/rsKliPPy/customentdata_amxx
Код:
#if defined _customentdata_included
    #endinput
#endif
#define _customentdata_included


#pragma reqlib customentdata
#if !defined AMXMODX_NOAUTOLOAD
    #pragma loadlib customentdata
#endif


/**
 * Sets custom entity data as cell
 *
 * @param entity            Entity to set data for
 * @param key               Identifier for data
 * @param data              Data to be set
 *
 * @noreturn
 */
native CED_SetCell(entity, const key[], any:data);

/**
 * Sets custom entity data as array
 *
 * @param entity            Entity to set data for
 * @param key               Identifier for data
 * @param data              Data to be set
 * @param size              Size of the data array
 *
 * @noreturn
 */
native CED_SetArray(entity, const key[], const any:data[], size);

/**
 * Sets custom entity data as string
 *
 * @param entity            Entity to set data for
 * @param key               Identifier for data
 * @param buffer            Data to be set
 *
 * @noreturn
 */
native CED_SetString(entity, const key[], const buffer[]);

/**
 * Gets custom entity data as cell
 *
 * @param entity            Entity to get data for
 * @param key               Identifier for data
 * @param data              Variable to put data in
 *
 * @return                  true if data identified by |key| exists, false otherwise
 */
native bool:CED_GetCell(entity, const key[], &any:data);

/**
 * Gets custom entity data as array
 *
 * @param entity            Entity to get data for
 * @param key               Identifier for data
 * @param data              Array to fill with data
 * @param size              Maximum size of |data| array
 *
 * @return                  true if data identified by |key| exists, false otherwise
 */
native bool:CED_GetArray(entity, const key[], any:data[], size);

/**
 * Gets custom entity data as string
 *
 * @param entity            Entity to get data for
 * @param key               Identifier for data
 * @param buffer            Buffer to put string data in
 * @param maxLength         Maximum length of |buffer| buffer
 *
 * @return                  true if data identified by |key| existed, false otherwise
 */
native bool:CED_GetString(entity, const key[], buffer[], maxLength);
 
Последнее редактирование модератором:
Сообщения
212
Реакции
334
Помог
3 раз(а)
pro100iweb, у тебя может быть выход за границы массива запросто. Максимальный айдишник объекта высчитывается по формуле 900 + (15 * maxplayers - 1). То есть у тебя все нормально будет только при 6 слотах. При дефолтном значении num_edicts максимум может достигать 1380, но базовое число может легко изменяться параметром запуска. В общем, крайне не советую такой вариант, либо задавать больше ячеек.
 
Сообщения
58
Реакции
2
Помог
2 раз(а)
Xelson, с лимитами не сталкивался, посчитал что 1000 это оптимальный вариант, да и если произойдут, то в логах ошибку увижу
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
pro100iweb, ты и не встретишься, если сервер будет создавать минимум объектов. Но такое возможно
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Xelson, если я удалю индекс, то другие собьются.

Xelson, спасибо за помощь, но всё не то, очень много лишнего придеться дергать. Думаю останусь при своём исполнении, так как это намного быстрее, хотя придеться жертвовать памятью )

Код:
new SentryThinkTime[1000]   // через сколько запустить цикл проверки видимости игроков
new RocketThinkTime[1000]             // готовность ракет
new RocketFires[1000]                      // количество ракет выпускаемых пушкой
new SentryTurnTarget[1000][2]         // поворот и наклон пушки при захвате цели
new SentryTurnTargetThink[1000]    // скорость вращения пушки
new SentryTarget[1000]                    // захваченная цель,ID игрока
new SentryNextUPDTime[1000]       // через сколько секунд возможно улучшить пушку
new SentryKills[1000]                       // количество убийств пушкой
Конечно можно в enum. Может я где то накосячил или была друга причина, но тогда из-за этого падал сервер, разделил и падения прекратились
Энтвары?
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
fl0wer, если инициализация динамического массива обязательна, то и сохранение ячеек тоже обязательно, чтобы этот порядок не терялся. Но лучше все же структуру хранить, да.
Про энтвары уже говорили
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
fl0wer, зачем ты повторяешь то что я уже говорил?
В этом случае лучше найти специальное поле в entvars для таких переменных, а так как это применяется к кастомному объекту, то свободных полей для таких целей полно
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Xelson, а почему он с первого раза не понял и юзает переменные?
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
Реализацию кастомных ентити и их think с параметрами можно подглядеть в Halloween Mod от Hedgehog Fog

Если оооочень надо хранить всё прямо в свойствах ентити - можно воспользоваться упаковкой более мелких чисел в большее число с помощью битовых операций. (Можно встретить в моде пушек у miRRor'a)
Типо такого:
Код:
#define MASK_OWNER                0xFFFFFFC0 // 11111111111111111111111111000000
#define MASK_UPGRADER_1            0xFFFFF03F // 11111111111111111111000000111111
#define MASK_UPGRADER_2            0xFFFC0FFF // 11111111111111000000111111111111
#define MASK_TARGET                0xFF03FFFF // 11111111000000111111111111111111
#define MASK_UPGRADER_3            0xC0FFFFFF // 11000000111111111111111111111111
new const MASKS_PEOPLE[5] = {MASK_OWNER, MASK_UPGRADER_1, MASK_UPGRADER_2, MASK_TARGET, MASK_UPGRADER_3}


SetSentryPeople(const SENTRY, const WHO) {
    new data = entity_get_int(SENTRY, SENTRY_INT_PEOPLE)
    data |= MASKS_PEOPLE[WHO]
    data ^= MASKS_PEOPLE[WHO]
    data = (data>>(WHO*SENTRY_PEOPLE_BITS))
    return data
}
SetSentryPeople(const SENTRY, const WHO, const IS) {
    new data = entity_get_int(SENTRY, SENTRY_INT_PEOPLE)
    data &= MASKS_PEOPLE[WHO] // nullify the setting
    data |= (IS<<(WHO*SENTRY_PEOPLE_BITS)) // set the setting
    entity_set_int(SENTRY, SENTRY_INT_PEOPLE, data) // store
}
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу