Many MotD Models amxx


Many MotD Models amxx
  • Обзор
  • Установка
  • Настройки
  • Код/Апи
  • Словарь
  • Команды
  • Обновления
  • Скриншоты/Видео
  • Благодарности

Автор: 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]:
Добавлен исходный код в тему ресурса.
Добавлена новая информация контактов поддержки.
Исходный код еще раз проверен на пригодность и успешное компилирование.
Пересобран архив.

__________________

__________________



[скачан: 1 раз(а)]

Комментарии к ресурсу

Комментариев пока нет. Будь первым!

Внимание! В комментариях запрещен мат, оскорбления, спам, флуд. Запрещены те комментарии, которые не относятся к тематике сайта в целом! Если будет обнаружено, то будет бан аккаунта. Оставлять комментарий к конкретному ресурсу можно только 1 раз на 1 аккаунт.

Вам необходима регистрация для отправки!