Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Удушливый дым для некоторых игроков

Статус пользователя Fraig
сообщение 6.1.2015, 13:43
Сообщение #1
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Имеется плагин удушливый дым. Этот плагин заставляет игроков задыхаться/кашлять и/или терять hp когда они находятся в дыму от дымовой гранаты.
Как сделать, чтобы был обычный дым для простых игроков и был удушливый для некоторых игроков (из файла брался список STEAM_ID игроков)?

Исходный код
Код:
/*	Copyright © 2008, ConnorMcLeod

GasNades is free software;
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GasNades; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#pragma semicolon 1

#define PLUGIN "GasNades"
#define AUTHOR "ConnorMcLeod"
#define VERSION "2.0.0"

#define GASP_SOUND1 "player/gasp1.wav"
#define GASP_SOUND2 "player/gasp2.wav"

#define PEV_PDATA_SAFE 2

#define MAX_PLAYERS 32

#define m_bitsDamageType 76 // VEN

#define OFFSET_TEAM 114
#define fm_get_user_team(%1) get_pdata_int(%1,OFFSET_TEAM)

#define write_coord_f(%1) engfunc(EngFunc_WriteCoord, %1)

#define GASNADE_HURT -666
#define GASNADE_HEAL -777

new g_pCvarRadius, g_pCvarCheckTime, g_pCvarDmg, g_pCvarFF, g_pCvarLife, g_pCvarGasp,
g_pCvarRestore, g_pCvarNoSmoke, g_pCvarEnabled;
new mp_friendlyfire;

new g_iMaxPlayers;

new g_iHealer;

new Float:g_fLastHurt[MAX_PLAYERS+1];
new Float:g_fDmgToRestore[MAX_PLAYERS+1];

new g_iForwardEmitSound;
new HamHook:g_iHamTouch, HamHook:g_iHamThink;

public plugin_init()
{
register_plugin( PLUGIN, VERSION, AUTHOR );
register_cvar("gasnade", VERSION, FCVAR_SERVER);

g_pCvarEnabled = register_cvar("amx_gasnades", "1");

g_pCvarDmg = register_cvar("amx_gasdmg", "5");
g_pCvarRadius = register_cvar("amx_gasradius", "220");
g_pCvarCheckTime = register_cvar("amx_gascheck", "2");
g_pCvarFF = register_cvar("amx_gasobeyFF", "0");
g_pCvarLife = register_cvar("amx_gaslife", "25");
g_pCvarGasp = register_cvar("amx_smokegasp", "1");
g_pCvarRestore = register_cvar("amx_gas_restore", "0");
g_pCvarNoSmoke = register_cvar("amx_gas_nosmoke", "0");

register_event("HLTV", "Event_HLTV_NewRound", "a", "1=0", "2=0");

g_iMaxPlayers = get_maxplayers();
mp_friendlyfire = get_cvar_pointer("mp_friendlyfire");

Event_HLTV_NewRound();
}

public plugin_precache()
{
precache_sound(GASP_SOUND1);
precache_sound(GASP_SOUND2);
}

public plugin_pause()
{
new iEnt = FM_NULLENT;
while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "trigger_hurt")) > 0 )
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
engfunc(EngFunc_RemoveEntity, iEnt);
}
Healer(0);
}

public Event_HLTV_NewRound()
{
new iEnt = FM_NULLENT;
while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", "trigger_hurt")) > 0 )
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
engfunc(EngFunc_RemoveEntity, iEnt);
}

for(new id=1; id<=g_iMaxPlayers; id++)
{
g_fLastHurt[id] = g_fDmgToRestore[id] = 0.0;
}

if( get_pcvar_num(g_pCvarEnabled) )
{
if( !g_iForwardEmitSound )
{
g_iForwardEmitSound = register_forward(FM_EmitSound, "EmitSound");
}

if( g_iHamTouch )
{
EnableHamForward(g_iHamTouch);
}
else
{
g_iHamTouch = RegisterHam(Ham_Touch, "trigger_hurt", "HurtTouch");
}

if( g_iHamThink )
{
EnableHamForward(g_iHamThink);
}
else
{
g_iHamThink = RegisterHam(Ham_Think, "trigger_hurt", "HurtThink");
}

Healer(get_pcvar_num(g_pCvarRestore) ? 1 : 0);
}
else
{
if( g_iForwardEmitSound )
{
unregister_forward(FM_EmitSound, g_iForwardEmitSound);
g_iForwardEmitSound = 0;
}

if( g_iHamTouch )
{
DisableHamForward(g_iHamTouch);
}

if( g_iHamThink )
{
DisableHamForward(g_iHamThink);
}

Healer(0);
}
}

public EmitSound(iEntity, iChannel, const szSample[], Float:fVol, Float:fAttn, iFlags, iPitch)
{
if( !equal(szSample, "weapons/sg_explode.wav") )
return;

new iEnt = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString, "trigger_hurt") );

dllfunc(DLLFunc_Spawn, iEnt);

new Float:fRadius = get_pcvar_float(g_pCvarRadius);
new Float:fMins[3], Float:fMaxs[3];
for(new i; i<3; i++)
{
fMins[i] = -fRadius;
fMaxs[i] = fRadius;
}
engfunc(EngFunc_SetSize , iEnt , fMins , fMaxs );

new Float:fOrigin[3];
pev(iEntity, pev_origin, fOrigin);
engfunc(EngFunc_SetOrigin, iEnt, fOrigin);

set_pev(iEnt, pev_dmg, get_pcvar_float(g_pCvarDmg));

set_pev(iEnt, pev_iuser1, GASNADE_HURT);

new iOwner = pev(iEntity, pev_owner);
if( pev_valid(iOwner) == PEV_PDATA_SAFE )
{
set_pev(iEnt, pev_iuser2, fm_get_user_team(iOwner));
set_pev(iEnt, pev_owner, iOwner);
}

set_pev(iEnt, pev_nextthink, get_gametime() + get_pcvar_float(g_pCvarLife));

if( get_pcvar_num(g_pCvarNoSmoke) )
{
emit_sound(iEntity, iChannel, szSample, fVol, fAttn, iFlags, iPitch);
engfunc(EngFunc_RemoveEntity, iEntity);
}
}

public HurtThink(iEnt)
{
if( pev(iEnt, pev_iuser1) == GASNADE_HURT )
{
engfunc(EngFunc_RemoveEntity, iEnt);
}
}

public HurtTouch(iEnt, id)
{
static iPod;
iPod = pev(iEnt, pev_iuser1);
if( (iPod != GASNADE_HURT && iPod != GASNADE_HEAL) ||
!(1 <= id <= g_iMaxPlayers) )
{
return HAM_IGNORED;
}

new iOwner = pev(iEnt, pev_owner);

if( iPod == GASNADE_HURT && get_pcvar_num(g_pCvarFF) && !get_pcvar_num(mp_friendlyfire) &&
pev(iEnt, pev_iuser2) == fm_get_user_team(id) )
{
return HAM_SUPERCEDE;
}

static Float:flTime, Float:flDmgTime;
flTime = get_gametime();
pev(iEnt, pev_dmgtime, flDmgTime);

if( flDmgTime > flTime )
{
static Float:flPainFinished;
pev(iEnt, pev_pain_finished, flPainFinished);
if( flTime != flPainFinished )
{
static iImpulse;
iImpulse = pev(iEnt, pev_impulse);
if ( iImpulse & (1<<(id-1)) )
return HAM_SUPERCEDE;

set_pev(iEnt, pev_impulse, iImpulse | (1<<(id-1)));
}
}
else
{
set_pev(iEnt, pev_impulse, (1<<(id-1)));
}

static Float:flDmg, Float:flCheckTime;
pev(iEnt, pev_dmg, flDmg);
flCheckTime = get_pcvar_float(g_pCvarCheckTime);

if( iPod == GASNADE_HURT )
{
TakeDamage(id, iEnt, iOwner, flDmg, DMG_SLOWFREEZE);
g_fDmgToRestore[id] += flDmg;

if(get_pcvar_num(g_pCvarGasp))
{
switch (random_num(1, 2))
{
case 1: emit_sound(id, CHAN_VOICE, GASP_SOUND1, 1.0, ATTN_NORM, 0, PITCH_NORM);
case 2: emit_sound(id, CHAN_VOICE, GASP_SOUND2, 1.0, ATTN_NORM, 0, PITCH_NORM);
}
}
g_fLastHurt[id] = flTime;
}
else
{
if( flTime - g_fLastHurt[id] > flCheckTime && g_fDmgToRestore[id])
{
if( g_fDmgToRestore[id] < flDmg )
{
flDmg = g_fDmgToRestore[id];
}
g_fDmgToRestore[id] -= flDmg;
TakeHealth(id, flDmg);
}
}

set_pev(iEnt, pev_pain_finished, flTime);
set_pev(iEnt, pev_dmgtime, flTime + flCheckTime);

return HAM_SUPERCEDE;
}

Healer(iStatus)
{
if( iStatus )
{
if( !pev_valid(g_iHealer) )
{
g_iHealer = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString, "trigger_hurt") );
dllfunc(DLLFunc_Spawn, g_iHealer);
engfunc(EngFunc_SetSize , g_iHealer , Float:{-4096.0, -4096.0, -4096.0} , Float:{4096.0, 4096.0, 4096.0} );
set_pev(g_iHealer, pev_iuser1, GASNADE_HEAL);
}
set_pev(g_iHealer, pev_dmg, get_pcvar_float(g_pCvarDmg));
}
else
{
if( pev_valid(g_iHealer) )
{
engfunc(EngFunc_RemoveEntity, g_iHealer);
g_iHealer = FM_NULLENT;
}
}
}

TakeHealth(id, Float:flDmg)
{
new Float:flHealth, Float:flMaxHealth;

pev(id, pev_health, flHealth);
pev(id, pev_max_health, flMaxHealth);

if( flMaxHealth <= flHealth )
return;

flHealth += flDmg;

if( flHealth > flMaxHealth )
flHealth = flMaxHealth;

set_pev(id, pev_health, flHealth);
}

TakeDamage(id, iEnt, iAttacker, Float:flDmg, iDmgBit)
{
new Float:flHealth;
pev(id, pev_health, flHealth);

flHealth -= flDmg;

if( flHealth < 1 )
{
ExecuteHamB( Ham_Killed, id, iAttacker, 0 );
return;
}

set_pev(id, pev_health, flHealth);

set_pev(id, pev_dmg_take, flDmg);
set_pdata_int(id, m_bitsDamageType, iDmgBit);
set_pev(id, pev_dmg_inflictor, iEnt);
}

Прикрепленный файл  amx_gasnades.sma ( 8,16 килобайт ) Кол-во скачиваний: 15
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   Цитировать сообщение
Статус пользователя Fraig
сообщение 6.1.2015, 19:31
Сообщение #2
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Возможно ли вообще так сделать?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 6.1.2015, 19:33
Сообщение #3


Стаж: 12 лет

Сообщений: 2237
Благодарностей: 1343
Полезность: 836

если только хп то банально проверку на флаги .
если же удушливый = зеленый а простой = серый (простой) то тут посложнее..


[Half-Life DM FFA] 78.152.169.100:27016
[CS 1.6 GunGame] 78.152.169.100:27018
[CS 1.6 DM AIM] 78.152.169.100:27017
[CS 1.6 DM FFA] 78.152.169.100:27015
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 6.1.2015, 19:50
Сообщение #4
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Цитата(ssx @ 6.1.2015, 20:33) *
если только хп то банально проверку на флаги .
если же удушливый = зеленый а простой = серый (простой) то тут посложнее..

По флагам как раз не подойдет, т.к. нужно, чтобы удушливый дым был не у всех. Например, если у нас есть 5 VIP игроков с флагом t, то из них только 2-ух есть удушливый дым.

На данный момент на сервере дымовая граната выдается на самом высоком звании (army ranks, купить ее нельзя). А плагин amx_gasnades просто заменяет обычную дымовую гранату. На сервере с самым высоким званием бегает 2-3 человека, следовательно дымовые гранаты есть только у них. Сами знаете как не хватает SG гранаты, когда на карте dd2 на подъеме стоит CT с AWP, а вы играете за T и рашите длину.. Поэтому, изменив плагин, мы хотим чтобы у всех была обычная SG граната, а у этих 2-3 человек (STEAM_ID которых мы запишем в ini файл и будем читать оттуда), была удушливая граната.

Отредактировал: Fraig, - 6.1.2015, 20:10
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
csgamerok
сообщение 6.1.2015, 20:56
Сообщение #5
Стаж: 12 лет

Сообщений: 265
Благодарностей: 16
Полезность: 0

хорошо бы сделать отдельный плагин, типа покупаешь гранату с удушливым дымом.
И когда бросаешь такую гранату, чтобы был зеленоватый дымок, когда заходишь то снимает по 10 хп за каждые полсекунды.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 6.1.2015, 21:00
Сообщение #6
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Цитата(csgamerok @ 6.1.2015, 21:56) *
хорошо бы сделать отдельный плагин, типа покупаешь гранату с удушливым дымом.
И когда бросаешь такую гранату, чтобы был зеленоватый дымок, когда заходишь то снимает по 10 хп за каждые полсекунды.

Это, наверное, еще сложнее сделать. Но мне нужно лишь то, что я описал выше, и не обязательно, чтобы у удушливой гранаты дым был другого цвета, хотя было бы прикольно.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
csgamerok
сообщение 6.1.2015, 22:01
Сообщение #7
Стаж: 12 лет

Сообщений: 265
Благодарностей: 16
Полезность: 0

ну а как будешь отличать можно в него заходить или нет,
лучше чтобы удушливый был слегка зеленоват
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 7.1.2015, 11:42
Сообщение #8


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

Черновой, но рабочий вариант.

Реально сделать с меньшей нагрузкой, но раз Вы говорите, что гранат на сервере мало, то может и так пойти.

В файле amx_gasnades.sma перед компеляцией раскомментируйте строки 85 и 86. После теста забыл.

Прикрепленный файл  ______.rar ( 2,93 килобайт ) Кол-во скачиваний: 9


Отредактировал: Fullserver, - 7.1.2015, 11:50
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
magiczoltrix
сообщение 7.1.2015, 12:35
Сообщение #9
Стаж: 12 лет

Сообщений: 234
Благодарностей: 22
Полезность: 0

Где взять звуки player/gasp1.wav
лучше настройки не в отдельном файле
addons/amxmodx/configs/gas_users.ini
а в обычном addons/amxmodx/configs/users.ini
например по определённому флагу, пусть будет по n
"STEAM_0:0:180447377" "" "n" "ce"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 7.1.2015, 12:51
Сообщение #10
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Цитата(magiczoltrix @ 7.1.2015, 13:35) *
Где взять звуки player/gasp1.wav
лучше настройки не в отдельном файле
addons/amxmodx/configs/gas_users.ini
а в обычном addons/amxmodx/configs/users.ini
например по определённому флагу, пусть будет по n
"STEAM_0:0:180447377" "" "n" "ce"

Вот звуки
Прикрепленный файл  sound.rar ( 15,05 килобайт ) Кол-во скачиваний: 4


а за что отвечает флаг n? у меня у всех админов данный флаг стоит
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 7.1.2015, 13:08
Сообщение #11
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

а так в плагине army_ranks как раз есть такой пункт

Код
// Добавить флаги. 0 - ничего не добавлять.
ar_bonus_flags "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"


То есть если сделать дым на флаг n, как написал magiczoltrix, и здесь сделать так

Код
ar_bonus_flags "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 n"


то прописывать даже ничего не придется, только за что отвечает флаг n?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 7.1.2015, 13:18
Сообщение #12


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

magiczoltrix, если делать привязку к флагу n, никакой дополнительный файл ini не понадобится. достаточно использовать
Код:
get_user_flags(id) & ADMIN_LEVEL_B


Fraig, Флаг n это ADMIN_LEVEL_B. В зависимости от плагина, отвечать может за что угодно. Стандартными плагинами не затрагивается.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
magiczoltrix
сообщение 7.1.2015, 13:23
Сообщение #13
Стаж: 12 лет

Сообщений: 234
Благодарностей: 22
Полезность: 0

Цитата(Fullserver @ 7.1.2015, 16:18) *
magiczoltrix, если делать привязку к флагу n, никакой дополнительный файл ini не понадобится. достаточно использовать
Код:
get_user_flags(id) & ADMIN_LEVEL_B


Fraig, Флаг n это ADMIN_LEVEL_B. В зависимости от плагина, отвечать может за что угодно. Стандартными плагинами не затрагивается.


Всё правильно, в стандартных он не используется, типа резервный.

Куда вписать эту строчку в исходнике, я слабо понимаю в програминге.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 7.1.2015, 20:30
Сообщение #14
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Fullserver, поставил плагин, изменил gas-users.ini, но в итоге удушливый дым есть и у других игроков.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя MrTsar
сообщение 8.1.2015, 12:34
Сообщение #15


Стаж: 13 лет

Сообщений: 206
Благодарностей: 7
Полезность: < 0

Почитал тему, стало интересно. А может кто-то сделать так что бы граната с удушающим дымом была у вип, тоесть что бы игроки например с флагом "t" могли ее купить, а для простых игроков недоступно было?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fraig
сообщение 8.1.2015, 23:45
Сообщение #16
Стаж: 14 лет

Сообщений: 93
Благодарностей: 7
Полезность: < 0

Цитата(Fullserver @ 7.1.2015, 13:18) *
Код:
get_user_flags(id) & ADMIN_LEVEL_B


А если сделать плагин по флагу, как ты говорил, где и что в коде нужно заменить?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: