Иконка ресурса

Easy multijump 1.6

Нет прав для скачивания
Сообщения
31
Реакции
30
Помог
1 раз(а)
Пользователь jesuspunk разместил новый ресурс:

Easy Multijump - Easy Multijump / Множественные прыжки для всех или для админов по флагу

С помощью этого плагина можно прыгать в воздухе, то есть вы можете отталкиваться от воздуха.

Переделанный плагин от twistedeuphoria под reapi. Без postThink и preThink, что уменьшает нагрузку на сервер.
Узнать больше об этом ресурсе...
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
jesuspunk , есть несколько замечаний по коду.
1) не обязательно на каждом прыжке узнавать имеются ли у игрока права админа
2) использование get_pcvar в данном случае существенно лучше.
3) у массивов для игроков должны быть указаны константы размерности. (Для ReAPI - есть MAX_CLIENTS)
4) Не вижу смысла в получении скорости игрока
Код:
get_entvar(id,var_velocity,velocity)


Так же, правильное именование функций облегчит жизнь и вам и тому, кто будет разбирать код.
Код:
    RegisterHookChain(RG_CBasePlayer_Jump,"player_jump")

Желательно имена функций задавайте фактически не меняя имя оригинальной функции.
То есть, player_jump >> CBasePlayer_Jump. Это личное пожелание :pardon:
 
Последнее редактирование:
Сообщения
31
Реакции
30
Помог
1 раз(а)
wopox1337, надеюсь я правильно понял замечания и переделал. Единственное что не понял как быть с
Код:
get_entvar(id,var_velocity,velocity)

Если не получать и определить 0, то игрок просто будет в высоту без направления прыгать...
 
Сообщения
31
Реакции
30
Помог
1 раз(а)
Пользователь jesuspunk обновил ресурс Easy Multijump новой записью:

Обновление Easy Multijump до версии 1.3

1) Убран инклуд amxmisc и тем самым изменен метод проверки флага админа с access() -> get_user_flags()
2) Переделаны квары в pcvar по совету от wopox1337
3) Проверка на наличие админки при прыжке переделана по совету от wopox1337
4) Снятие флага админа при смене ника.(если админки по нику)
5) Добавлена константа MAX_CLIENTS по совету от wopox1337
Узнать больше об этом обновлении...
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
jesuspunk, да, извиняюсь я это не учёл. У вас правильно.
Так же наблюдается не логичность проверок, зачем дважды в одной функции проверять nbut & IN_JUMP ?

Ветку условий можно составить лучше, чем меньше проверок - тем ведь лучше конкретно в данном случае.
 
Последнее редактирование:
Сообщения
31
Реакции
30
Помог
1 раз(а)
wopox1337, да, мне самому не нравилось, сделал так, но вот не знаю, разумно так часто pcvar дергать или вернуть булевую глобальную переменную?
Код:
public CBasePlayer_Jump(id)
{
if(!is_user_alive(id)) return PLUGIN_HANDLED
if(get_pcvar_num(pCvar_amx_mjadminonly) && !g_isAdmin[id]) return PLUGIN_HANDLED
new obut = get_member(id,m_afButtonLast)
if(!(get_entity_flags(id) & FL_ONGROUND) && !(obut & IN_JUMP) && jumpnum[id] < get_pcvar_num(pCvar_amx_maxjumps))
{
new Float:velocity[3]
get_entvar(id,var_velocity,velocity)
velocity[2] = random_float(265.0,285.0)
set_entvar(id,var_velocity,velocity)
jumpnum[id]++
}
else if(get_entity_flags(id) & FL_ONGROUND)
{
jumpnum[id] = 0
}
return PLUGIN_CONTINUE
}
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
jesuspunk, pcvar норм все.
Так же возможно имеет смысл использования static, вместо new на получение вектора скорости?
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Значение cvar-ов можно кэшировать и реагировать только на их изменение (особенно если AMXX >= 1.8.3)
И еще можна изменить условия так

C++:

new pCvar_amx_maxjumps, pCvar_amx_mjadminonly;
new maxjumps, mjadminonly;

public plugin_init()
{
register_plugin("MultiJump","1.4","twistedeuphoria/jesuspunk")

pCvar_amx_maxjumps = register_cvar("amx_maxjumps","1")
pCvar_amx_mjadminonly = register_cvar("amx_mjadminonly","0")

RegisterHookChain(RG_CBasePlayer_Jump,"CBasePlayer_Jump")

set_task(120.0, "TaskCheckCvars", .falgs="b");
}

public TaskCheckCvars()
{
maxjumps = get_pcvar_num(pCvar_amx_maxjumps);
mjadminonly = get_pcvar_num(pCvar_amx_mjadminonly);
}

public CBasePlayer_Jump(id)
{
if (!us_user_alive(id) || (mjadminonly && !g_isAdmin[id])) {
return return HC_CONTINUE;
}
if (get_entvar(id, var_flags) & FL_ONGROUND) {
jumpnum[id] = 0;
} else if ((~get_member(id, m_afButtonLast) & IN_JUMP) && jumpnum[id] < maxjumps) {
static Float:velocity[3];
get_entvar(id, var_velocity, velocity);
velocity[2] = random_float(265.0, 285.0);
set_entvar(id, var_velocity,velocity);
jumpnum[id]++;
}
return HC_CONTINUE;
}
 
Последнее редактирование:
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
jesuspunk, предлагаю изменить логику квара amx_mjadminonly.
Он будет хранить флаги (например bit), которые должен иметь игрок, чтобы пользоваться функционалом.
Если значение пустое - доступен всем.
Например для различного рода VIP функционала и подобного ему.
реагировать только на их изменение
Для amxx 1.8.3 это является форвардом, который можно установить при надобности. Следовательно полезный функционал скриптеру.
 
Последнее редактирование:
Сообщения
31
Реакции
30
Помог
1 раз(а)
вот fantom, провел настоящую оптимизацию кода, что то я совсем слепой стал и не увидел var_flags да и сообщения на форуме (
wopox1337, где то можно почитать про эти биты? Я просто этого не знаю. + про форварды
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
Видимо не так меня понял),
Bit - это права випа. Ну, я лишь в пример привёл эти 3. А так, их много. Полный список алфавита почти.
(типа abcdefg и так далее)
Почитать можно в документации к AMXX, пример использования bind_pcvar_*, create_cvar найти в CS AFK Manager - AlliedModders
 
Сообщения
31
Реакции
30
Помог
1 раз(а)
wopox1337, написано же bit вот я и начал гугл мучать что за set user/player bit в amx 1.8.3 есть ) а это просто флаги, да так будет логичнее и удобнее.
 
Сообщения
31
Реакции
30
Помог
1 раз(а)
Пользователь jesuspunk обновил ресурс Easy Multijump новой записью:

Оптимизация кода и доработка

Спасибо fantom за полную оптимизацию, теперь и модуль engine не нужен, плагин полностью только на reapi.
Изменен принцип работы квара amx_mjadminonly, теперь он работает по флагам.
Добавлен хук для квара amx_mjadminonly, чтобы сбросить или выставить игрокам право на прыжки без перезагрузки карты/сервера/реконекта игрока.
Наконец то изменил имя плагина.
Узнать больше об этом обновлении...
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
support to worox1337 & fantom
1) new jumpnum[MAX_CLIENTS] = 0 - если ты так хотел заполнить массив нулями, то делается это так:
Код:
new jumpnum[MAX_CLIENTS] = {0, ...}
new bool:g_isActiveJump[MAX_CLIENTS] = {false, ...}
 
Последнее редактирование:
Сообщения
31
Реакции
30
Помог
1 раз(а)
wopox1337, намечается, просто пока костыль все не знаю как приделать к своей задумке... а что не правильно? точка?

Да хотел заполнить 0
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
jesuspunk, я поправил сообщение выше. Под рукой у меня в данный момент нет компьютера, не совсем удобно пользоваться с планшета)
15 Мар 2017
IMG_0129.PNG

jesuspunk , так же на этом моменте у тебя "деоптимизация"
1) залогируй как часто вызывается чистый infochanged
2) используй хук от реапи, для infochanged name
3) на дисконнект и коннекте ты сбрасываешь игроку данные о функционале, хотя можно лишь на коннекте
4) разве на amxx 1.8.3 не имеется g_iMaxPlayers?
5) боты тоже под все проверки попадают?

Так же для удобства можешь использовать:
Код:
    if(_isAdmin(id)) g_isActiveJump[id] = true
else g_isActiveJump[id] = false
>>
g_IsAcriveJump[id] = _isAdmin(Id) ? true : false

А, по моему и тернарная не нужна, если ты указываешь, что функция _isAdmin(id) возвращает bool
То есть:
Код:
g_IsAcriveJump[id] = _isAdmin(Id)
 
Сообщения
31
Реакции
30
Помог
1 раз(а)
wopox1337, в пух и прах мой код )
1,2) видел сколько раз дергается, подумал что не страшно, спасибо за ссылку на reapi(RG_CBasePlayer_SetClientUserInfoName)
3)Решил перестраховаться, зря.
4) а что использовать? Если писать:
Код:
for(new id = 1; id <= MAX_PLAYERS; id++)

или MAX_CLIENTS, то во время работы плагина будет ошибка Invalid player id 12, тестовый сервер на 11 слотов.
5) да тоже (
6) за g_isActiveJump[id] = _isAdmin(id), большое спасибо.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
support to worox1337 & fantom
меня не обязательно указывать ))
разве на amxx 1.8.3 не имеется g_iMaxPlayers?
MaxClients

g_IsAcriveJump[id] = _isAdmin(Id) ? true : false
Можна сразу bool возвращать
а что использовать? Если писать:
MaxClients для 1.8.3 и get_maxplayers(занести в глобальную переменную MaxClients) для 1.8.2
 

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

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