Скриптер
Моделлер
Участник
Пользователь
- Сообщения
- 845
- Реакции
- 521
- Помог
- 13 раз(а)
Приветствую
Проблема в следующем: есть код, который ловит звуки шагов, подменяя на свои значения. Проблема в том, что через emit_sound звуки шагов не получается отловить, а вот через SV_StartSound (Reapi) вполне, но через этот способ я получаю stack error. Блокировку звуков с клиентской стороны я уже блокировал, с этим никаких проблем, только с серверной. Остальные звуки, которые мне так же нужно было заменить - работают вполне нормально через FM_EmitSound без каких-либо ошибок, но как я уже сказал через последний нельзя отловить звуки шагов.
При ошибке Stack Error нет указания на конкретную строку. Я вполне понимаю, что при вызове emit_sound'а в SV_StartSound может выйти повторный вызов саму на себя (фактически рекурсию), тогда как быть?
решил костылем
если есть варианты лучше - предложите, я только рад буду
Проблема в следующем: есть код, который ловит звуки шагов, подменяя на свои значения. Проблема в том, что через emit_sound звуки шагов не получается отловить, а вот через SV_StartSound (Reapi) вполне, но через этот способ я получаю stack error. Блокировку звуков с клиентской стороны я уже блокировал, с этим никаких проблем, только с серверной. Остальные звуки, которые мне так же нужно было заменить - работают вполне нормально через FM_EmitSound без каких-либо ошибок, но как я уже сказал через последний нельзя отловить звуки шагов.
При ошибке Stack Error нет указания на конкретную строку. Я вполне понимаю, что при вызове emit_sound'а в SV_StartSound может выйти повторный вызов саму на себя (фактически рекурсию), тогда как быть?
Код:
// Emit Sound Forward
#if defined SOUND_THROW_REAPI
#define EVENT_BLOCKED HC_SUPERCEDE
#define EVENT_NOT_BLOCKED HC_CONTINUE
public fw_EmitSound(recipient, id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
#else
#define EVENT_BLOCKED FMRES_SUPERCEDE
#define EVENT_NOT_BLOCKED FMRES_IGNORED
public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, const flags, const pitch)
#endif
{
// Replace these next sounds for zombies only
if (BIT_NOT_VALID(g_bitsConnected, id))
return EVENT_NOT_BLOCKED;
static classid;
#define MAC_START(%0) g_pEnd[%0][classid][_START] // в массиве содержится информация о начальном и конечных номерах звуков
#define MAC_END(%0) g_pEnd[%0][classid][_END] // из общего пула
if (BIT_VALID(g_bitsZombie, id)) {
classid = g_zombieclass[id];
// Zombie being hit
if (sample[7] == 'b' && sample[8] == 'h' && sample[9] == 'i' && sample[10] == 't') {
if (MAC_START(ZOMBIE_PAIN) != -1) {
ArrayGetString(zclass_sound_pain, random_num(MAC_START(ZOMBIE_PAIN), MAC_END(ZOMBIE_PAIN)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "pain: avoided on invalid array");
}
}
// Zombie dies
if (sample[7] == 'd' && ((sample[8] == 'i' && sample[9] == 'e') || (sample[8] == 'e' && sample[9] == 'a')))
{
if (MAC_START(ZOMBIE_DIE) != -1) {
ArrayGetString(zclass_sound_die, random_num(MAC_START(ZOMBIE_DIE), MAC_END(ZOMBIE_DIE)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "die: avoided on invalid array");
}
}
// Zombie falls off
if (sample[10] == 'f' && sample[11] == 'a' && sample[12] == 'l' && sample[13] == 'l')
{
if (MAC_START(ZOMBIE_FALL) != -1) {
ArrayGetString(zclass_sound_fall, random_num(MAC_START(ZOMBIE_FALL), MAC_END(ZOMBIE_FALL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "fall: avoided on invalid array");
}
}
// Zombie attacks with knife
if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i') {
if (sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') { // slash
if (MAC_START(ZOMBIE_MISS_SLASH) != -1) {
ArrayGetString(zclass_sound_miss_slash, random_num(MAC_START(ZOMBIE_MISS_SLASH), MAC_END(ZOMBIE_MISS_SLASH)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "miss slash: avoided on invalid array");
}
}
if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') { // hit
if (sample[17] == 'w') { // wall
if (MAC_START(ZOMBIE_MISS_WALL) != -1) {
ArrayGetString(zclass_sound_miss_wall, random_num(MAC_START(ZOMBIE_MISS_WALL), MAC_END(ZOMBIE_MISS_WALL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "miss wall: avoided on invalid array");
}
}
else {
if (MAC_START(ZOMBIE_HIT_NORMAL) != -1) {
ArrayGetString(zclass_sound_hit_normal, random_num(MAC_START(ZOMBIE_HIT_NORMAL), MAC_END(ZOMBIE_HIT_NORMAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "hit normal: avoided on invalid array");
}
}
}
if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
{
if (MAC_START(ZOMBIE_HIT_STAB) != -1) {
ArrayGetString(zclass_sound_hit_stab, random_num(MAC_START(ZOMBIE_HIT_STAB), MAC_END(ZOMBIE_HIT_STAB)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "hit stab: avoided on invalid array");
}
}
}
if (sample[0] == 'p' && sample[1] == 'l') {
if (sample[10] == 's' && sample[11] == 't') { // pl_step
if (MAC_START(ZOMBIE_FOOTSTEPS) != -1) {
ArrayGetString(zclass_sound_zombie_footsteps, random_num(MAC_START(ZOMBIE_FOOTSTEPS), MAC_END(ZOMBIE_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps: avoided on invalid array");
}
}
else if(sample[7] == 'h' && sample[10] == 'd')
{
}
else if (sample[10] == 's' && sample[11] == 'h') { // ignore this pl_shell
return EVENT_NOT_BLOCKED;
}
// pl_dirt
else if (sample[11] == 'i') {
if (sample[10] == 'd') {
if (MAC_START(ZOMBIE_FOOTSTEPS_DIRT) != -1) {
ArrayGetString(zclass_sound_zombie_footsteps_dirt, random_num(MAC_START(ZOMBIE_FOOTSTEPS_DIRT), MAC_END(ZOMBIE_FOOTSTEPS_DIRT)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps dirt: avoided on invalid array");
}
}
else {
// pl_tile пол cs_havana
if (MAC_START(ZOMBIE_FOOTSTEPS) != -1) {
ArrayGetString(zclass_sound_zombie_footsteps, random_num(MAC_START(ZOMBIE_FOOTSTEPS), MAC_END(ZOMBIE_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps tile: avoided on invalid array");
}
}
}
else if (sample[10] == 'u' || sample[11] == 'r' && sample[12] == 'a' || sample[10] == 'm' && sample[12] == 't') { // pl_duct (глухой шаг по металлической крыше)
if (MAC_START(ZOMBIE_FOOTSTEPS_METAL) != -1) {
ArrayGetString(zclass_sound_zombie_footsteps_metal, random_num(MAC_START(ZOMBIE_FOOTSTEPS_METAL), MAC_END(ZOMBIE_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps duct: avoided on invalid array");
}
}
else if (sample[10] == 'l' && sample[11] == 'a' && sample[12] == 'd') { // pl_ladder
if (MAC_START(ZOMBIE_FOOTSTEPS_METAL) != -1) {
ArrayGetString(zclass_sound_zombie_footsteps_ladder, random_num(MAC_START(ZOMBIE_FOOTSTEPS_METAL), MAC_END(ZOMBIE_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps ladder: avoided on invalid array");
}
}
}
}
else {
classid = g_humanclass[id];
// Human being hit
if (sample[7] == 'b' && sample[8] == 'h' && sample[9] == 'i' && sample[10] == 't') {
if (MAC_START(HUMAN_PAIN) != -1) {
ArrayGetString(class_sound_pain, random_num(MAC_START(HUMAN_PAIN), MAC_END(HUMAN_PAIN)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "pain: avoided on invalid array");
}
}
// human dies
if (sample[7] == 'd' && ((sample[8] == 'i' && sample[9] == 'e') || (sample[8] == 'e' && sample[9] == 'a')))
{
if (MAC_START(HUMAN_DIE) != -1) {
ArrayGetString(class_sound_die, random_num(MAC_START(HUMAN_DIE), MAC_END(HUMAN_DIE)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "die: avoided on invalid array");
}
}
// Zombie falls off
if (sample[10] == 'f' && sample[11] == 'a' && sample[12] == 'l' && sample[13] == 'l')
{
if (MAC_START(HUMAN_FALL) != -1) {
ArrayGetString(class_sound_fall, random_num(MAC_START(HUMAN_FALL), MAC_END(HUMAN_FALL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "fall: avoided on invalid array");
}
}
if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i') {
if (sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') { // slash
if (MAC_START(HUMAN_MISS_SLASH) != -1) {
ArrayGetString(class_sound_miss_slash, random_num(MAC_START(HUMAN_MISS_SLASH), MAC_END(HUMAN_MISS_SLASH)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "miss slash: avoided on invalid array");
}
}
if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') { // hit
if (sample[17] == 'w') { // wall
if (MAC_START(HUMAN_MISS_WALL) != -1) {
ArrayGetString(class_sound_miss_wall, random_num(MAC_START(HUMAN_MISS_WALL), MAC_END(HUMAN_MISS_WALL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "miss wall: avoided on invalid array");
}
}
else {
if (MAC_START(HUMAN_HIT_NORMAL) != -1) {
ArrayGetString(class_sound_hit_normal, random_num(MAC_START(HUMAN_HIT_NORMAL), MAC_END(HUMAN_HIT_NORMAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "hit normal: avoided on invalid array");
}
}
}
if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
{
if (MAC_START(HUMAN_HIT_STAB) != -1) {
ArrayGetString(class_sound_hit_stab, random_num(MAC_START(HUMAN_HIT_STAB), MAC_END(HUMAN_HIT_STAB)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "hit stab: avoided on invalid array");
}
}
}
if (sample[0] == 'p' && sample[1] == 'l') {
if (sample[10] == 's' && sample[11] == 't') { // pl_step
if (MAC_START(HUMAN_FOOTSTEPS) != -1) {
ArrayGetString(class_sound_human_footsteps, random_num(MAC_START(HUMAN_FOOTSTEPS), MAC_END(HUMAN_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps: avoided on invalid array");
}
}
else if(sample[7] == 'h' && sample[10] == 'd')
{
}
else if (sample[10] == 's' && sample[11] == 'h') { // ignore this pl_shell
return EVENT_NOT_BLOCKED;
}
// pl_dirt
else if (sample[11] == 'i') {
if (sample[10] == 'd') {
if (MAC_START(HUMAN_FOOTSTEPS_DIRT) != -1) {
ArrayGetString(class_sound_human_footsteps_dirt, random_num(MAC_START(HUMAN_FOOTSTEPS_DIRT), MAC_END(HUMAN_FOOTSTEPS_DIRT)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps dirt: avoided on invalid array");
}
}
else {
if (MAC_START(HUMAN_FOOTSTEPS) != -1) {
ArrayGetString(class_sound_human_footsteps, random_num(MAC_START(HUMAN_FOOTSTEPS), MAC_END(HUMAN_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps tile: avoided on invalid array");
}
}
}
else if (sample[10] == 'u' || sample[11] == 'r' && sample[12] == 'a' || sample[10] == 'm' && sample[12] == 't') { // pl_duct (глухой шаг по металлической крыше)
if (MAC_START(HUMAN_FOOTSTEPS_METAL) != -1) {
ArrayGetString(class_sound_human_footsteps_metal, random_num(MAC_START(HUMAN_FOOTSTEPS_METAL), MAC_END(HUMAN_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps duct: avoided on invalid array");
}
}
else if (sample[10] == 'l' && sample[11] == 'a' && sample[12] == 'd') { // pl_ladder
if (MAC_START(HUMAN_FOOTSTEPS_METAL) != -1) {
ArrayGetString(class_sound_human_footsteps_ladder, random_num(MAC_START(HUMAN_FOOTSTEPS_METAL), MAC_END(HUMAN_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
return EVENT_BLOCKED;
}
else {
client_print(0, print_chat, "footsteps ladder: avoided on invalid array");
}
}
}
}
return EVENT_NOT_BLOCKED;
}
21 Авг 2018
Код:
#if defined SOUND_THROW_REAPI
if (BIT_VALID(g_bitsStatus, id)) {
BIT_SUB(g_bitsStatus, id);
return EVENT_NOT_BLOCKED;
}
#endif