- Обзор
- Установка
- Настройки
- Код/Апи
- Словарь
- Команды
- Обновления
- Скриншоты/Видео
- Благодарности
Автор: ar222`
Версия: 1.0.5
Совместимость с: Amx Mod X 1.9.0, Amx Mod X 1.10.0 dev
Требования:
1. Правильно сделанная модель для показа. (что-бы была в зоне видимости игрока)
2. На сервере не должно быть 'кастомных оружий', иначе плагин будет работать неправильно.
3. Работа плагина возможна в двух режимах, если используется режим ReAPI, то ReAPI.
Описание:
Плагин является достойной заменой стандартному показу motd окна через команду на сервере в чат.
Написав команду в чат, например: 'say /p1', будет отображена ваша заведомо поставленная модель (например правила сервера).
Возможности:
- Создание многих соотношений моделей и команд.
- Возможность указать время до исчезновения моделей. (отдельно для каждой)
- Возможность включать музыку при показе модели. (отдельно для каждой)
Преимущества:
- Гибкая настройка.
- Модель не сбросится даже если игрок будет менять оружие.
- Если используется музыка при показе модели, то неважна ее длительность, так как, она выключится по истечению времени показа.
- Два режима использования плагина, с fakemeta или reapi, кому как хочется.
Настройка:
В .sma:
//#define USE_FAKEMETA //откомменитровать если нужна работа плагина с использованием fakemeta
#if defined USE_FAKEMETA
#include
#endif
#define USE_REAPI //откомменитровать если нужна работа плагина с использованием reapi
#if defined USE_REAPI
#include
#endif
В .ini:
;Файл настроек моделей, команд, времени и музыки.
;Всего доступно 99 соотношений.
;Формат: "путь до модели" "команда" "время исчезновение в сек." "наименование музыки"
;Если музыка во время показа модели не нужна, то вместо наименования вписываем "none"
;Музыка должна быть формата .wav, а также находиться в папке sound.
;Пример: "models/logo.mdl" "/open-logo" "5" "none" (без музыки)
;Пример: "models/logo.mdl" "/open-logo" "5" "snd.wav" (с музыкой в папке sound)
;Пример: "models/logo.mdl" "/open-logo" "5" "server-sound/snd.wav" (с музыкой в папке 2 уровня)
"models/logo1.mdl" "/p1" "5" "none"
"models/logo2.mdl" "/p2" "10" "snd.wav"
/*
Contact support:
site: https://ar-plugins.ru
telegram: @cmdeveloper
vk: https://vk.com/dm1triy222
Журнал изменений:
ver 1.0.1:
1. Изменен способ получения v_ модели оружия (был хард код), спасибо: fantom
2. Рефакторинг кода, реапи заменен на fakemeta, спасибо: fantom
To doo..
Попытаться исправить баг:
Существует маленький баг, когда у игрока был например пистолет, а старая модель меняется в то время когда стоит нож, то нож поменяется на пистолет.
Лечится просто сменой оружия. (на функциональность не влияет, лишь визуальное)
ver 1.0.2:
1. Добавлена возможность включить музыку при просмотре модели игроком (отдельно для каждой модели), настройка в .ini. (если в кавычках "none", то выключено для модели и скачиваться не будет)
2. Музыка включается когда начинается показываться модель игроку, а выключается, по истечению времени показа соответственно.
2. Убран лишний include, спасибо Mini.
3. Добавлены новые переменные и строки кода где это нужно, для правильной работы всего добавленного.
ver 1.0.3:
1. Заменен способ воспроизведения музыки с 'emit_sound' на 'emit_sound2', спасибо: d3m37r4 и создателю 'emit_sound2' -_-
ver 1.0.4:
1. Теперь для воспроизведения музыки используется native rh_emit_sound2 (reapi), спасибо: fl0wer
ver 1.0.5:
1. Теперь плагин может работать в двух режимах, первый, это с использованием fakemeta, второй, с использованием reapi.
2. Если Вам нужно оставить только fakemeta, то закомментируйте '#define USE_REAPI', иначе, если нужно только reapi, то закомментируйте '#define USE_FAKEMETA'
3. Для режима с использованием fakemeta, добавлен 'stock SendAudio', дабы не юзать реапи, лишь только из-за соунда. Спасибо: Minni
*/
#include <amxmodx>
//#define USE_FAKEMETA //откомменитровать если нужна работа плагина с использованием fakemeta
#if defined USE_FAKEMETA
#include <fakemeta>
#endif
#define USE_REAPI //откомменитровать если нужна работа плагина с использованием reapi
#if defined USE_REAPI
#include <reapi>
#endif
new const PLUGIN[] = "Many MotD Models";
new const VERSION[] = "1.0.5";
new const AUTHOR[] = "ar222`";
new const DIR[] = "many_motd_models";
new const FILE[] = "many_motd_models.ini";
enum
{
MESSAGE_LENGHT = 191,
MAX_INFO_DATA = 99
};
enum _:INFO_DATA
{
MODELS[MAX_RESOURCE_PATH_LENGTH],
CMD[MAX_NAME_LENGTH],
TIME,
SOUND[MAX_RESOURCE_PATH_LENGTH]
};
#if defined USE_FAKEMETA
new NewModelId[MAX_PLAYERS+1], OldModelId[MAX_PLAYERS+1], ModelIndex[MAX_INFO_DATA];
#else
new NewWeaponView[MAX_PLAYERS+1][MAX_RESOURCE_PATH_LENGTH], OldWeaponView[MAX_PLAYERS+1][MAX_RESOURCE_PATH_LENGTH];
#endif
new eInfoData[MAX_INFO_DATA][INFO_DATA], bool:CheckMotdModelPre[MAX_PLAYERS+1], bool:CheckMotdModelPost[MAX_PLAYERS+1];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_event("CurWeapon", "WeaponChange", "be", "1=1");
for(new i; i < sizeof eInfoData; i++)
{
if(!eInfoData[i][CMD])
{
continue;
}
register_clcmd(fmt("say %s", eInfoData[i][CMD]), "ShowMotdModelOn");
}
}
public plugin_precache()
{
ReadCfg();
}
ReadCfg()
{
new MainDir[MAX_RESOURCE_PATH_LENGTH];
get_localinfo("amxx_configsdir", MainDir, charsmax(MainDir))
if(!dir_exists(fmt("%s/%s", MainDir, DIR)))
{
set_fail_state("[Many MotD Models]: Plugin error! missing dir: %s/%s", MainDir, DIR);
}
new File[MAX_RESOURCE_PATH_LENGTH * 2];
formatex(File, charsmax(File), "%s/%s/%s", MainDir, DIR, FILE);
if(!file_exists(File))
{
set_fail_state("[Many MotD Models]: Plugin error! missing file: %s", File);
}
new Data[250], models[MAX_RESOURCE_PATH_LENGTH], cmd[MAX_NAME_LENGTH], time[5], sound[MAX_RESOURCE_PATH_LENGTH];
new f = fopen(File, "rt"), i;
while(!feof(f))
{
fgets(f, Data, charsmax(Data));
trim(Data);
if(!Data[0] || Data[0] == ';' || Data[0] == '/')
{
continue;
}
parse(Data, models, charsmax(models), cmd, charsmax(cmd), time, charsmax(time), sound, charsmax(sound));
formatex(eInfoData[i][MODELS], charsmax(eInfoData[][MODELS]), "%s", models);
if(!file_exists(eInfoData[i][MODELS]))
{
set_fail_state("[Many MotD Models]: Plugin error! missing model: %s", eInfoData[i][MODELS]);
}
else
{
precache_model(eInfoData[i][MODELS]);
}
if(equal(sound, "none"))
{
formatex(eInfoData[i][SOUND], charsmax(eInfoData[][SOUND]), "%s", sound);
}
else
{
formatex(eInfoData[i][SOUND], charsmax(eInfoData[][SOUND]), "%s", sound);
if(!file_exists(fmt("sound/%s", eInfoData[i][SOUND])))
{
set_fail_state("[Many MotD Models]: Plugin error! missing sound: %s", eInfoData[i][SOUND]);
}
else
{
precache_sound(eInfoData[i][SOUND]);
}
}
#if defined USE_FAKEMETA
ModelIndex[i] = engfunc(EngFunc_AllocString, eInfoData[i][MODELS]);
#endif
formatex(eInfoData[i][CMD], charsmax(eInfoData[][CMD]), "%s", cmd);
eInfoData[i][TIME] = str_to_num(time);
i++;
}
fclose(f);
}
public client_disconnected(id)
{
CheckMotdModelPre[id] = false;
CheckMotdModelPost[id] = false;
remove_task(id);
}
public WeaponChange(id)
{
if(!CheckMotdModelPre[id] && !CheckMotdModelPost[id])
{
return;
}
if(CheckMotdModelPre[id])
{
#if defined USE_FAKEMETA
set_pev(id, pev_viewmodel, NewModelId[id]);
#else
set_entvar(id, var_viewmodel, NewWeaponView[id]);
#endif
}
else
{
if(!CheckMotdModelPost[id])
{
#if defined USE_FAKEMETA
set_pev(id, pev_viewmodel, OldModelId[id]);
#else
set_entvar(id, var_viewmodel, OldWeaponView[id]);
#endif
CheckMotdModelPost[id] = true;
}
}
}
public ShowMotdModelOn(id)
{
new Cmd[MESSAGE_LENGHT];
read_argv(1, Cmd, charsmax(Cmd));
for(new i; i < sizeof eInfoData; i++)
{
if(equal(Cmd, eInfoData[i][CMD]))
{
CheckMotdModelPre[id] = true;
CheckMotdModelPost[id] = false;
#if defined USE_FAKEMETA
OldModelId[id] = pev(id, pev_viewmodel);
set_pev(id, pev_viewmodel, ModelIndex[i]);
NewModelId[id] = ModelIndex[i];
#else
get_entvar(id, var_viewmodel, OldWeaponView[id], charsmax(OldWeaponView[]));
set_entvar(id, var_viewmodel, eInfoData[i][MODELS]);
formatex(NewWeaponView[id], charsmax(NewWeaponView[]), "%s", eInfoData[i][MODELS]);
#endif
if(!equal(eInfoData[i][SOUND], "none"))
{
#if defined USE_FAKEMETA
SendAudio(id, eInfoData[i][SOUND]);
#else
rh_emit_sound2(id, id, CHAN_STATIC, eInfoData[i][SOUND], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
#endif
}
new array[1];
array[0] = i;
set_task(float(eInfoData[i][TIME]), "ShowMotdModelOff", id, array, sizeof array);
break;
}
}
}
public ShowMotdModelOff(const array[1], id)
{
CheckMotdModelPre[id] = false;
new num = array[0];
if(!equal(eInfoData[num][SOUND], "none"))
{
#if defined USE_FAKEMETA
SendAudio(id, "common/null.wav");
#else
rh_emit_sound2(id, id, CHAN_STATIC, eInfoData[num][SOUND], VOL_NORM, ATTN_NORM, SND_STOP, PITCH_NORM);
#endif
}
#if defined USE_FAKEMETA
set_pev(id, pev_viewmodel, OldModelId[id]);
#else
set_entvar(id, var_viewmodel, OldWeaponView[id]);
#endif
}
#if defined USE_FAKEMETA
stock SendAudio(id, const audio[], pitch = 100)
{
static iMsgSendAudio;
if(!iMsgSendAudio)
{
iMsgSendAudio = get_user_msgid("SendAudio");
}
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iMsgSendAudio, .player = id);
write_byte(id);
write_string(audio);
write_short(pitch);
message_end();
}
#endif
__________________
Команды: Которые Вы создадите сами.
[Обновление без изменения версии]:
[Added]:
__________________
__________________