Утвержденные плагины для AMX Mod X администратором/модератором форума.
Модератор: Leonidddd
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.
В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".
Subb98 » 30 мар 2016, 18:30
Текущая версия: 0.1 от 28.03.2016
Описание:Данный плагин запускает разминку на ножах после события начала игры ('
Game Commencing!'). Работает как на
HLDS, так и на
ReHLDS. Несмотря на небольшую задачу, которую выполняет плагин (с точки зрения пользователя), исходный код получился достаточно объёмным. Это связано с большим количеством нюансов и особенностей работы скрипта, о которых я всецело постараюсь рассказать далее.
Особенности:- запуск разминки при каждом событии 'Game Commencing!' (можно отключить для экономии ресурсов)
- спаун игрока после выбора класса
- 35 ед. здоровья при спауне (можно настроить)
- респаун игрока после смерти (по типу Deathmatch)
- забавные звуки при убийстве (стандартные)
- блокировка стандартных HUD элементов: прицела, патронов, weaponlist'а, таймера и денег
- блокировка HUD иконки оружия (для C4 у террористов, которая начинает мигать, когда игрок находится в зоне закладки бомбы)
- блокировка использования заложников (в этом нет особой нужды, просто чтобы не вызывать лишних вопросов у игрока в определённых случаях)
- удаление любого оружия, кроме ножа, при его добавлении в инвентарь игрока (также и при поднятии оружия на карте)
- более информативный HUD таймер до окончания разминки вместо стандартного
- информационные HUD сообщения игроку о текущем состоянии разминки (1 сообщение при первом спауне и 1 сообщение по завершении разминки)
Требования:Модули:- Counter-Strike (cstrike.inc)
- Engine (engine.inc)
- Ham Sandwich (hamsandwich.inc)
- RoundControl (roundcontrol.inc; опционально)
Настройки: - Код: Выделить всё
const MAX_PLAYERS = 32; const WARMUP_TIME = 90; const Float:RESPAWN_DELAY = 0.75; const Float:SHOW_MSG_DELAY = 0.5; const Float:WARMUP_HEALTH = 35.0;
Планируемые обновления:- реализовать WARMUP_TIME кваром, чтобы иметь возможность назначать для каждой карты собственное время (ранее поступали просьбы от игроков сократить время разминки; данный метод будет не совсем удобен, поэтому также рассматривается способ с расстановкой на картах случайных точек спаунов)
Примечание:Самую первую версию этого плагина я писал в 2012-м или 2013-м году, наступило время произвести рефакторинг и новой версией я хотел бы поделиться со всеми, кто любит такое оружие, как нож и желает видеть разминку на ножах на своём сервере. Чего я ожидаю взамен? Конструктивной критики, указаний на недочёты в коде, предложений / пожеланий / идей по функционалу и т.д. Буду рад, если Вы данный плагин хотя бы не поленитесь протестировать и ещё больше мне будет приятно, если он Вам понравится.
Благодарности:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
-
Subb98
-
- Сообщения: 5485
- Зарегистрирован: 24 мар 2011, 19:42
- Откуда: г. Пермь
- Благодарил (а): 1329 раз.
- Поблагодарили: 2343 раз.
- Опыт программирования: Больше трех лет
- Языки программирования: PHP
airat0708 » 31 май 2016, 22:54
плагин хорош. подскажите как включить HUD элементы и HUD иконки оружия ?
-
airat0708
-
- Сообщения: 2
- Зарегистрирован: 02 июл 2012, 22:57
- Благодарил (а): 0 раз.
- Поблагодарили: 1 раз.
- Опыт программирования: Меньше недели
- Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Team Fortress II
Left 4 Dead
Subb98 » 31 май 2016, 23:11
airat0708, попробуйте такой вариант, если я верно вас понял. Не проверял:
- Код: Выделить всё
const MAX_PLAYERS = 32; const WARMUP_TIME = 90; const Float:RESPAWN_DELAY = 0.75; const Float:SHOW_MSG_DELAY = 0.5; const Float:WARMUP_HEALTH = 35.0; new const KILL_SOUNDS[][] = {
"misc/sheep.wav", "misc/killChicken.wav", "misc/cow.wav"
};
enum {
WS_WAITING = 1,
WS_BEGIN,
WS_IN_PROGRESS,
WS_ENDED
}
new HamHook:g_pHamSpawn, HamHook:g_pHamAddPlayerItem, HamHook:g_pHamGiveAmmo, HamHook:g_pHamUse, HamHook:g_pHamKilled;
new RoundControlHook:g_pCheckWinHook;
new g_pRoundInfinite, g_szRoundInfinite[10];
new g_pRestartRound, g_pHudSyncObj1, g_pHudSyncObj2, g_pThinkEnt, g_iConnectedBitsum, g_iAliveBitsum, g_iMessageBitsum, g_iFrags[MAX_PLAYERS + 1],
g_iWarmupState = WS_WAITING, g_iTimerCount;
public plugin_precache() {
for(new i; i < sizeof KILL_SOUNDS; i++) {
precache_sound(KILL_SOUNDS[i]);
}
}
public plugin_init() {
register_plugin("Knife warmup", "0.1", "Subb98");
register_clcmd("joinclass", "CmdJoinClass");
const JOIN_CLASS_MENU_KEYS = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5;
register_menucmd(register_menuid("Terrorist_Select"), JOIN_CLASS_MENU_KEYS, "CmdJoinClass");
register_menucmd(register_menuid("CT_Select"), JOIN_CLASS_MENU_KEYS, "CmdJoinClass");
register_event("HLTV", "EventHLTV", "a", "1=0", "2=0");
register_logevent("EventGameCommencing", 2, "1=Game_Commencing");
register_logevent("EventRoundStart", 2, "1=Round_Start");
register_logevent("EventRoundEnd", 2, "1=Round_End");
new const ENT_CLASSNAME[] = "player";
DisableHamForward(g_pHamSpawn = RegisterHam(Ham_Spawn, ENT_CLASSNAME, "HamSpawnPlayerPost", 1));
DisableHamForward(g_pHamAddPlayerItem = RegisterHam(Ham_AddPlayerItem, ENT_CLASSNAME, "HamAddPlayerItemPre"));
DisableHamForward(g_pHamGiveAmmo = RegisterHam(Ham_GiveAmmo, ENT_CLASSNAME, "HamGiveAmmoPre"));
DisableHamForward(g_pHamUse = RegisterHam(Ham_Use, "hostage_entity", "HamUseHostagePre"));
DisableHamForward(g_pHamKilled = RegisterHam(Ham_Killed, ENT_CLASSNAME, "HamKilledPlayerPost", 1));
g_pRoundInfinite = get_cvar_pointer("mp_round_infinite");
g_pRestartRound = get_cvar_pointer("sv_restartround");
g_pHudSyncObj1 = CreateHudSyncObj();
g_pHudSyncObj2 = CreateHudSyncObj();
CreateThinkEntity();
}
public plugin_cfg() {
if(g_pRoundInfinite) {
get_pcvar_string(g_pRoundInfinite, g_szRoundInfinite, charsmax(g_szRoundInfinite));
}
}
public client_putinserver(id) {
ResetValues(id);
if(!is_user_bot(id) && !is_user_hltv(id)) {
bit_set(id, g_iConnectedBitsum);
}
}
public client_disconnect(id) {
ResetValues(id);
remove_task(id);
}
public CmdJoinClass(const id) {
if(g_iWarmupState == WS_IN_PROGRESS) {
set_task(RESPAWN_DELAY, "TaskRespawn", id);
}
}
public EventHLTV() {
switch(g_iWarmupState) {
case WS_BEGIN: {
g_iWarmupState = WS_IN_PROGRESS;
g_iMessageBitsum = 0;
EnableHamForward(g_pHamSpawn);
EnableHamForward(g_pHamAddPlayerItem);
EnableHamForward(g_pHamGiveAmmo);
EnableHamForward(g_pHamUse);
EnableHamForward(g_pHamKilled);
g_pCheckWinHook = SetBlockControl(RC_CheckWinConditions);
if(g_pRoundInfinite) {
set_pcvar_num(g_pRoundInfinite, 1);
}
}
case WS_ENDED: {
entity_set_float(g_pThinkEnt, EV_FL_nextthink, get_gametime() + SHOW_MSG_DELAY);
}
}
}
public EventGameCommencing() {
if(g_iWarmupState == WS_WAITING) {
g_iWarmupState = WS_BEGIN;
}
}
public EventRoundStart() {
if(g_iWarmupState == WS_IN_PROGRESS) {
entity_set_float(g_pThinkEnt, EV_FL_nextthink, get_gametime() + 1.0);
}
}
public EventRoundEnd() {
if(g_iWarmupState == WS_IN_PROGRESS) {
g_iWarmupState = WS_ENDED;
DisableHamForward(g_pHamSpawn);
DisableHamForward(g_pHamAddPlayerItem);
DisableHamForward(g_pHamGiveAmmo);
DisableHamForward(g_pHamUse);
DisableHamForward(g_pHamKilled);
RemoveBlockControl(RC_CheckWinConditions, g_pCheckWinHook);
if(g_pRoundInfinite) {
set_pcvar_string(g_pRoundInfinite, g_szRoundInfinite);
}
set_pcvar_float(g_pRestartRound, 1.0);
}
}
public HamSpawnPlayerPost(const id) {
if(is_user_alive(id)) {
bit_set(id, g_iAliveBitsum);
if(!bit_valid(id, g_iMessageBitsum)) {
set_task(SHOW_MSG_DELAY, "TaskWarmupStartMsg", id);
}
entity_set_float(id, EV_FL_health, WARMUP_HEALTH);
engclient_cmd(id, "weapon_knife");
}
}
public HamAddPlayerItemPre(const id, const pEnt) {
if(cs_get_weapon_id(pEnt) != CSW_KNIFE) {
entity_set_int(pEnt, EV_INT_flags, entity_get_int(pEnt, EV_INT_flags ) | FL_KILLME);
SetHamReturnInteger(0);
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
public HamGiveAmmoPre() {
const NO_AMMO_STOP_PROCESSING = -1;
SetHamReturnInteger(NO_AMMO_STOP_PROCESSING);
return HAM_SUPERCEDE;
}
public HamUseHostagePre() {
return HAM_SUPERCEDE;
}
public HamKilledPlayerPost(const id, const pKiller) {
bit_clear(id, g_iAliveBitsum);
if(bit_valid(pKiller, g_iAliveBitsum)) {
if(g_iFrags[pKiller] == sizeof KILL_SOUNDS) {
g_iFrags[pKiller] = 0;
}
emit_sound(pKiller, CHAN_VOICE, KILL_SOUNDS[g_iFrags[pKiller]], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
g_iFrags[pKiller]++;
}
set_task(RESPAWN_DELAY, "TaskRespawn", id);
}
public FwdThink(const pEnt) {
switch(g_iWarmupState) {
case WS_IN_PROGRESS: {
static iDiff, iMin;
iDiff = WARMUP_TIME - g_iTimerCount++, iMin = 0;
GetMinutes(iDiff, iMin);
set_hudmessage(128, 64, _, _, 0.96, _, _, 1.0, 0.0, 0.01, -1);
ShowSyncHudMsg(0, g_pHudSyncObj1, "До конца разминки: %d:%d", iMin, iDiff);
if(iDiff || iMin) {
entity_set_float(pEnt, EV_FL_nextthink, get_gametime() + 1.0);
} else {
EventRoundEnd();
}
}
case WS_ENDED: {
g_iWarmupState = WS_WAITING;
g_iTimerCount = 0;
set_hudmessage(0, 255, _, _, 0.25, _, _, 5.0, _, _, -1);
ShowSyncHudMsg(0, g_pHudSyncObj2, "Приготовьтесь к бою!^nИгра началась!");
pause("d");
}
}
}
public TaskRespawn(const id) {
if(bit_valid(id, g_iConnectedBitsum) && !bit_valid(id, g_iAliveBitsum) && cs_get_user_team(id) != CS_TEAM_SPECTATOR) {
ExecuteHamB(Ham_CS_RoundRespawn, id);
}
}
public TaskWarmupStartMsg(const id) {
if(bit_valid(id, g_iAliveBitsum)) {
set_hudmessage(255, 0, _, _, 0.25, _, _, 5.0, _, _, -1);
ShowSyncHudMsg(id, g_pHudSyncObj2, "Приготовьтесь к бойне!^nРазминка на ножах началась!");
bit_set(id, g_iMessageBitsum);
}
}
CreateThinkEntity() {
new const ENT_CLASSNAME[] = "_warmup_think_ent";
if((g_pThinkEnt = create_entity("info_target"))) {
entity_set_string(g_pThinkEnt, EV_SZ_classname, ENT_CLASSNAME);
register_think(ENT_CLASSNAME, "FwdThink");
} else {
set_fail_state("Failed to create think entity");
}
}
ResetValues(const id) {
bit_clear(id, g_iConnectedBitsum);
bit_clear(id, g_iAliveBitsum);
bit_clear(id, g_iMessageBitsum);
g_iFrags[id] = 0;
}
GetMinutes(&iSec, &iMin) {
const SECONDS_IN_MINUTE = 60;
iMin = iSec / SECONDS_IN_MINUTE, iSec %= SECONDS_IN_MINUTE;
}
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
-
Subb98
-
- Сообщения: 5485
- Зарегистрирован: 24 мар 2011, 19:42
- Откуда: г. Пермь
- Благодарил (а): 1329 раз.
- Поблагодарили: 2343 раз.
- Опыт программирования: Больше трех лет
- Языки программирования: PHP
Капитан » 02 дек 2016, 17:40
Добрый день, очень понравился плагин.
Но есть ошибка в логах, включил дебаг и вот, в исходникe ничего не менял.
- Код: Выделить всё
L 12/01/2016 - 23:04:48: [AMXX] Run time error 4: index out of bounds
L 12/01/2016 - 23:04:48: [AMXX] [0] knife_warmup.sma::ResetValues (line 274)
L 12/01/2016 - 23:04:48: [AMXX] [1] knife_warmup.sma::client_disconnect (line 101)
Последний раз редактировалось
Капитан 02 дек 2016, 18:25, всего редактировалось 1 раз.
-
Капитан
-
- Сообщения: 12
- Зарегистрирован: 06 мар 2016, 21:05
- Благодарил (а): 14 раз.
- Поблагодарили: 0 раз.
Subb98 » 02 дек 2016, 18:23
Капитан, добрый день. Вообще, странно, что появилась эта ошибка, могу посоветовать сделать следующее:
- Код: Выделить всё
ResetValues(const id) {
bit_clear(id, g_iConnectedBitsum);
bit_clear(id, g_iAliveBitsum);
bit_clear(id, g_iMessageBitsum);
g_iFrags[id] = 0;
}
>>
- Код: Выделить всё
ResetValues(const id) {
bit_clear(id, g_iConnectedBitsum);
bit_clear(id, g_iAliveBitsum);
bit_clear(id, g_iMessageBitsum);
if(is_user_connected(id)) {
g_iFrags[id] = 0;
}
}
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
-
Subb98
-
- Сообщения: 5485
- Зарегистрирован: 24 мар 2011, 19:42
- Откуда: г. Пермь
- Благодарил (а): 1329 раз.
- Поблагодарили: 2343 раз.
- Опыт программирования: Больше трех лет
- Языки программирования: PHP
Капитан » 02 дек 2016, 18:25
Спасибо большое, проверю и отпишусь.
-
Капитан
-
- Сообщения: 12
- Зарегистрирован: 06 мар 2016, 21:05
- Благодарил (а): 14 раз.
- Поблагодарили: 0 раз.
Капитан » 03 дек 2016, 15:44
Есть опять ошибка:
- Код: Выделить всё
12/03/2016 - 12:02:33: [AMXX] Run time error 4: index out of bounds
L 12/03/2016 - 12:02:33: [AMXX] [0] knife_warmup.sma::ResetValues (line 275)
L 12/03/2016 - 12:02:33: [AMXX] [1] knife_warmup.sma::client_putinserver (line 94)
L 12/03/2016 - 12:04:01: [AMXX] Displaying debug trace (plugin "knife_warmup.amxx")
L 12/03/2016 - 12:04:01: [AMXX] Run time error 4: index out of bounds
L 12/03/2016 - 12:04:01: [AMXX] [0] knife_warmup.sma::ResetValues (line 275)
L 12/03/2016 - 12:04:01: [AMXX] [1] knife_warmup.sma::client_disconnect (line 101)
-
Капитан
-
- Сообщения: 12
- Зарегистрирован: 06 мар 2016, 21:05
- Благодарил (а): 14 раз.
- Поблагодарили: 0 раз.
Subb98 » 03 дек 2016, 15:58
Капитан, прикрепите, пожалуйста, также исходный код.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
-
Subb98
-
- Сообщения: 5485
- Зарегистрирован: 24 мар 2011, 19:42
- Откуда: г. Пермь
- Благодарил (а): 1329 раз.
- Поблагодарили: 2343 раз.
- Опыт программирования: Больше трех лет
- Языки программирования: PHP
Капитан » 03 дек 2016, 17:59
Вот, пожалуйста.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
Капитан
-
- Сообщения: 12
- Зарегистрирован: 06 мар 2016, 21:05
- Благодарил (а): 14 раз.
- Поблагодарили: 0 раз.
Leonidddd » 04 дек 2016, 01:22
Капитан, обратите внимание на
- Код: Выделить всё
const MAX_PLAYERS = 16;
Сколько у Вас максимальное кол-во игроков на сервере?
Скорее-всего больше, так бы ошибки подобной никогда не было бы.
-
Leonidddd
-
- Сообщения: 2557
- Зарегистрирован: 08 апр 2012, 18:13
- Откуда: г. Запорожье
- Благодарил (а): 192 раз.
- Поблагодарили: 718 раз.
Вернуться в Утвержденные плагины
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3