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

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

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

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

> Правила форума

Этот раздел, как вы могли заметить по названию, предназначен для решения вопросов по поводу уже существующих модов и плагинов.
Пожалуйста, если у вас проблема с написанием плагина, не путайте этот раздел с разделом по скриптингу.
Для поиска плагинов и модов существует соответствующий раздел.

Название темы должно соответствовать содержанию. Темы с названием типа "Помогите", "Вопрос", "парни подскажите..." - будут удалены.
Все темы, не относящиеся к "Вопросам по модам и плагинам", будут удалены или перемещены в соответствующий раздел.

Правила оформления темы:
1. Помимо заголовка не забудьте верно сформулировать свой вопрос.
2. Выложите исходник (в тег кода + ) или ссылку на плагин который вызывает у вас вопросы.
3. Выложите лог с ошибками (если имеется) под спойлер

Переделать AFK Bomb Transfer

, Переделать сообщения с HUD на чат.
Статус пользователя X*CaHeK*X
сообщение 9.10.2013, 14:13
Сообщение #1
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Я не силен в этом, потому прошу помощи. Нужно сменить HUD сообщения на обычные, в чат.

Скрытый текст
/* AMX Mod X
* AFK Bomb Transfer
*
* © Copyright 2006 by VEN
*
* This file is provided as is (no warranties)
*
* DESCRIPTION
* Plugin allow transfer bomb from AFK terrorist to closest non-AFK teammate.
* Plugin will have no effect:
* - at the freezetime
* - if bomb is planting
* - on non-bomb maps (comment #define BOMB_MAP_CHECK to suppress)
*
* MODULES
* fakemeta
*
* CVARS
* afk_bombtransfer_spawn (N: seconds, default: 7) - max. allowed bomb carrier AFK time
* affects on spawned AFK bomb carrier which never moved after spawn
*
* afk_bombtransfer_time (N: seconds, default: 15) - max. allowed bomb carrier AFK time
* affects on any AFK bomb carrier except one which obey previous CVAR
*
* HUD MESSAGES
* Terrorist team (green color)
* Bomb transferred to "NEW_CARRIER_NAME"
* since "AFK_CARRIER_NAME" is AFK
*
* New bomb carrier (yellow color)
* You got the bomb!
*
* Note: by defult message display time is 7 seconds (define MSG_TIME)
*
* VERSIONS
* 0.4 backpack transfer method greatly improved
* added pcvar natives support (backward compatibility saved)
* few code optimization
* 0.3 now fakemeta instead of engine required (efficiency++ if engine is disabled)
* "non-bomb map" check can be disabled (//#define BOMB_MAP_CHECK)
* backpack finding method improved
* few code optimization
* added comments to the plugin source code
* 0.2 fixed format issue
* code optimized
* description improved
*
* 0.1 first release
*/

/* *************************************************** Init **************************************************** */

#include <amxmodx>
#include <fakemeta>

// plugin's main information
#define PLUGIN_NAME "AFK Bomb Transfer"
#define PLUGIN_VERSION "0.4"
#define PLUGIN_AUTHOR "VEN"

// comment to avoid autodisabling the plugin on maps which not contain bomb targets
#define BOMB_MAP_CHECK

// float value, hud messages display time (in seconds)
#define MSG_TIME 7.0

// CVAR name, affects on spawned AFK bomb carrier which never moved after spawn
new CVAR_SPAWN[] = "afk_bombtransfer_spawn"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_SPAWN[] = "7"

// CVAR name, affects on any AFK bomb carrier except one which obey previous CVAR
new CVAR_TIME[] = "afk_bombtransfer_time"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_TIME[] = "15"

// do not set this value less than "maxplayers"
#define MAX_PLAYERS 32

// initial AMXX version number supported CVAR pointers in get/set_pcvar_* natives
#define CVAR_POINTERS_AMXX_INIT_VER_NUM 170

// determine if get/set_pcvar_* natives can be used
#if defined AMXX_VERSION_NUM && AMXX_VERSION_NUM >= CVAR_POINTERS_AMXX_INIT_VER_NUM
#define CVAR_POINTERS
new g_pcvar_spawn
new g_pcvar_time
#endif

new TEAM[] = "TERRORIST"
new WEAPON[] = "weapon_c4"

#define FL_ONGROUND (1<<9)

new bool:g_freezetime = true
new bool:g_spawn
new bool:g_planting

new g_carrier

new g_pos[MAX_PLAYERS + 1][3]
new g_time[MAX_PLAYERS + 1]

new g_maxplayers

public plugin_init() {
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

#if defined CVAR_POINTERS
g_pcvar_spawn = register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
g_pcvar_time = register_cvar(CVAR_TIME, DEFAULT_TIME)
#else
register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
register_cvar(CVAR_TIME, DEFAULT_TIME)
#endif

#if defined BOMB_MAP_CHECK
// is current map not contain bomb targets?
if (!engfunc(EngFunc_FindEntityByString, -1, "classname", "func_bomb_target"))
return
#endif

register_event("WeapPickup", "event_got_bomb", "be", "1=6")
register_event("BarTime", "event_bar_time", "be")
register_event("TextMsg", "event_bomb_drop", "bc", "2=#Game_bomb_drop")
register_event("TextMsg", "event_bomb_drop", "a", "2=#Bomb_Planted")
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

register_logevent("logevent_round_start", 2, "1=Round_Start")

set_task(1.0, "task_afk_check", _, _, _, "b") // plugin's core loop

g_maxplayers = get_maxplayers()
}

/* *************************************************** Base **************************************************** */

public event_new_round() {
g_freezetime = true
g_spawn = true
g_planting = false
g_carrier = 0
}

public event_got_bomb(id) {
g_carrier = id
}

public event_bar_time(id) {
if (id == g_carrier) {
g_planting = bool:read_data(1)
get_user_origin(id, g_pos[id])
g_time[id] = 0
}
}

public event_bomb_drop() {
g_spawn = false
g_planting = false
g_carrier = 0
}

public logevent_round_start() {
new id[32], num
get_players(id, num, "ae", TEAM)

if (!num) // is server empty?
return

g_freezetime = false

// update afk timers and current positions
new x
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, g_pos[x])
g_time[x] = 0
}
}

public task_afk_check() {
if (g_freezetime) // is freezetime right now?
return

// afk check
new id[32], num, x, origin[3]
get_players(id, num, "ae", TEAM)
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, origin)
if (origin[0] != g_pos[x][0] || origin[1] != g_pos[x][1] || (x == g_carrier && g_planting)) {
g_time[x] = 0
g_pos[x][0] = origin[0]
g_pos[x][1] = origin[1]
if (g_spawn && x == g_carrier)
g_spawn = false
}
else
g_time[x]++
}

// is bomb not currently carried or Ts number less than 2?
if (!g_carrier || num < 2)
return

#if defined CVAR_POINTERS
new max_time = get_pcvar_num(g_spawn ? g_pcvar_spawn : g_pcvar_time)
#else
new max_time = get_cvar_num(g_spawn ? CVAR_SPAWN : CVAR_TIME)
#endif

// is plugin disabled (cvar <= 0) or carrier isn't afk?
if (max_time <= 0 || g_time[g_carrier] < max_time)
return

// find who from non-afk Ts is the closest to the afk carrier
get_user_origin(g_carrier, origin)
new min_dist = 9999999, dist, recipient, origin2[3]
for (new i = 0; i < num; ++i) {
x = id[i]
if (g_time[x] < max_time) {
get_user_origin(x, origin2)
dist = get_distance(origin, origin2)
if (dist < min_dist) {
min_dist = dist
recipient = x
}
}
}

if (!recipient) // is all Ts afk?
return

new carrier = g_carrier
engclient_cmd(carrier, "drop", WEAPON) // drop the backpack
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", WEAPON) // find weapon_c4 entity
if (!c4)
return

new backpack = pev(c4, pev_owner) // get backpack entity
if (backpack <= g_maxplayers)
return

// my backpack transfer trick (improved)
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)

// hud messages stuff below
set_hudmessage(0, 255, 0, 0.35, 0.8, _, _, MSG_TIME)
new message[128], c_name[32], r_name[32]
get_user_name(carrier, c_name, 31)
get_user_name(recipient, r_name, 31)
format(message, 127, "[SERVER] Бомба передана ^"%s^", т.к ^"%s^" AFK", r_name, c_name)
for (new i = 0; i < num; ++i)
show_hudmessage(id[i], "%s", message)

set_hudmessage(255, 255, 0, 0.42, 0.3, _, _, MSG_TIME, _, _, 3)
show_hudmessage(recipient, "[SERVER] Теперь бомба у вас!")
}

/* **************************************************** EOF **************************************************** */
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
eckoecko
сообщение 9.10.2013, 14:21
Сообщение #2
Стаж: 14 лет

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

show_hudmessage(id[i], "%s", message) меняешь на client_print(id[i],print_chat, "%s", message)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя xSav
сообщение 9.10.2013, 14:27
Сообщение #3
Стаж: 16 лет

Сообщений: 1131
Благодарностей: 174
Полезность: 126

Цитата(X*CaHeK*X @ 9.10.2013, 16:13) *
Я не силен в этом, потому прошу помощи. Нужно сменить HUD сообщения на обычные, в чат.


И это пишет тот который античит допиливает ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 9.10.2013, 14:32
Сообщение #4
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Цитата(xSav @ 9.10.2013, 18:27) *
И это пишет тот который античит допиливает ?

Скрытый текст
?! Ты меня путаешь с другим Саньком. У него похожий ник. Вот ты и спутал. Я в скриптинге не силен. На уровне новичка (русификация плагина и отключение колорчата; мною ненавидимого.)


Отредактировал: X*CaHeK*X, - 14.10.2013, 18:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 14.10.2013, 18:28
Сообщение #5
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

UP!
Одно сообщение из HUD в чат переделано. А что на счет:
Цитата
set_hudmessage(255, 255, 0, 0.42, 0.3, _, _, MSG_TIME, _, _, 3)
show_hudmessage(recipient, "Теперь бомба у вас!")


Отредактировал: X*CaHeK*X, - 14.10.2013, 18:59
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 14.10.2013, 22:52
Сообщение #6


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

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

ответ же уже дали

Код
set_hudmessage(255, 255, 0, 0.42, 0.3, _, _, MSG_TIME, _, _, 3)
show_hudmessage(recipient, "[SERVER] Теперь бомба у вас!")

на
Код
client_print(recipient,print_chat, "[SERVER] Теперь бомба у вас!")
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Tkd
сообщение 15.10.2013, 10:36
Сообщение #7
Стаж: 13 лет

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

Цитата(X*CaHeK*X @ 9.10.2013, 15:13) *
Я не силен в этом, потому прошу помощи. Нужно сменить HUD сообщения на обычные, в чат.

Скрытый текст
/* AMX Mod X
* AFK Bomb Transfer
*
* © Copyright 2006 by VEN
*
* This file is provided as is (no warranties)
*
* DESCRIPTION
* Plugin allow transfer bomb from AFK terrorist to closest non-AFK teammate.
* Plugin will have no effect:
* - at the freezetime
* - if bomb is planting
* - on non-bomb maps (comment #define BOMB_MAP_CHECK to suppress)
*
* MODULES
* fakemeta
*
* CVARS
* afk_bombtransfer_spawn (N: seconds, default: 7) - max. allowed bomb carrier AFK time
* affects on spawned AFK bomb carrier which never moved after spawn
*
* afk_bombtransfer_time (N: seconds, default: 15) - max. allowed bomb carrier AFK time
* affects on any AFK bomb carrier except one which obey previous CVAR
*
* HUD MESSAGES
* Terrorist team (green color)
* Bomb transferred to "NEW_CARRIER_NAME"
* since "AFK_CARRIER_NAME" is AFK
*
* New bomb carrier (yellow color)
* You got the bomb!
*
* Note: by defult message display time is 7 seconds (define MSG_TIME)
*
* VERSIONS
* 0.4 backpack transfer method greatly improved
* added pcvar natives support (backward compatibility saved)
* few code optimization
* 0.3 now fakemeta instead of engine required (efficiency++ if engine is disabled)
* "non-bomb map" check can be disabled (//#define BOMB_MAP_CHECK)
* backpack finding method improved
* few code optimization
* added comments to the plugin source code
* 0.2 fixed format issue
* code optimized
* description improved
*
* 0.1 first release
*/

/* *************************************************** Init **************************************************** */

#include <amxmodx>
#include <fakemeta>

// plugin's main information
#define PLUGIN_NAME "AFK Bomb Transfer"
#define PLUGIN_VERSION "0.4"
#define PLUGIN_AUTHOR "VEN"

// comment to avoid autodisabling the plugin on maps which not contain bomb targets
#define BOMB_MAP_CHECK

// float value, hud messages display time (in seconds)
#define MSG_TIME 7.0

// CVAR name, affects on spawned AFK bomb carrier which never moved after spawn
new CVAR_SPAWN[] = "afk_bombtransfer_spawn"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_SPAWN[] = "7"

// CVAR name, affects on any AFK bomb carrier except one which obey previous CVAR
new CVAR_TIME[] = "afk_bombtransfer_time"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_TIME[] = "15"

// do not set this value less than "maxplayers"
#define MAX_PLAYERS 32

// initial AMXX version number supported CVAR pointers in get/set_pcvar_* natives
#define CVAR_POINTERS_AMXX_INIT_VER_NUM 170

// determine if get/set_pcvar_* natives can be used
#if defined AMXX_VERSION_NUM && AMXX_VERSION_NUM >= CVAR_POINTERS_AMXX_INIT_VER_NUM
#define CVAR_POINTERS
new g_pcvar_spawn
new g_pcvar_time
#endif

new TEAM[] = "TERRORIST"
new WEAPON[] = "weapon_c4"

#define FL_ONGROUND (1<<9)

new bool:g_freezetime = true
new bool:g_spawn
new bool:g_planting

new g_carrier

new g_pos[MAX_PLAYERS + 1][3]
new g_time[MAX_PLAYERS + 1]

new g_maxplayers

public plugin_init() {
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

#if defined CVAR_POINTERS
g_pcvar_spawn = register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
g_pcvar_time = register_cvar(CVAR_TIME, DEFAULT_TIME)
#else
register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
register_cvar(CVAR_TIME, DEFAULT_TIME)
#endif

#if defined BOMB_MAP_CHECK
// is current map not contain bomb targets?
if (!engfunc(EngFunc_FindEntityByString, -1, "classname", "func_bomb_target"))
return
#endif

register_event("WeapPickup", "event_got_bomb", "be", "1=6")
register_event("BarTime", "event_bar_time", "be")
register_event("TextMsg", "event_bomb_drop", "bc", "2=#Game_bomb_drop")
register_event("TextMsg", "event_bomb_drop", "a", "2=#Bomb_Planted")
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

register_logevent("logevent_round_start", 2, "1=Round_Start")

set_task(1.0, "task_afk_check", _, _, _, "b") // plugin's core loop

g_maxplayers = get_maxplayers()
}

/* *************************************************** Base **************************************************** */

public event_new_round() {
g_freezetime = true
g_spawn = true
g_planting = false
g_carrier = 0
}

public event_got_bomb(id) {
g_carrier = id
}

public event_bar_time(id) {
if (id == g_carrier) {
g_planting = bool:read_data(1)
get_user_origin(id, g_pos[id])
g_time[id] = 0
}
}

public event_bomb_drop() {
g_spawn = false
g_planting = false
g_carrier = 0
}

public logevent_round_start() {
new id[32], num
get_players(id, num, "ae", TEAM)

if (!num) // is server empty?
return

g_freezetime = false

// update afk timers and current positions
new x
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, g_pos[x])
g_time[x] = 0
}
}

public task_afk_check() {
if (g_freezetime) // is freezetime right now?
return

// afk check
new id[32], num, x, origin[3]
get_players(id, num, "ae", TEAM)
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, origin)
if (origin[0] != g_pos[x][0] || origin[1] != g_pos[x][1] || (x == g_carrier && g_planting)) {
g_time[x] = 0
g_pos[x][0] = origin[0]
g_pos[x][1] = origin[1]
if (g_spawn && x == g_carrier)
g_spawn = false
}
else
g_time[x]++
}

// is bomb not currently carried or Ts number less than 2?
if (!g_carrier || num < 2)
return

#if defined CVAR_POINTERS
new max_time = get_pcvar_num(g_spawn ? g_pcvar_spawn : g_pcvar_time)
#else
new max_time = get_cvar_num(g_spawn ? CVAR_SPAWN : CVAR_TIME)
#endif

// is plugin disabled (cvar <= 0) or carrier isn't afk?
if (max_time <= 0 || g_time[g_carrier] < max_time)
return

// find who from non-afk Ts is the closest to the afk carrier
get_user_origin(g_carrier, origin)
new min_dist = 9999999, dist, recipient, origin2[3]
for (new i = 0; i < num; ++i) {
x = id[i]
if (g_time[x] < max_time) {
get_user_origin(x, origin2)
dist = get_distance(origin, origin2)
if (dist < min_dist) {
min_dist = dist
recipient = x
}
}
}

if (!recipient) // is all Ts afk?
return

new carrier = g_carrier
engclient_cmd(carrier, "drop", WEAPON) // drop the backpack
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", WEAPON) // find weapon_c4 entity
if (!c4)
return

new backpack = pev(c4, pev_owner) // get backpack entity
if (backpack <= g_maxplayers)
return

// my backpack transfer trick (improved)
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)

// hud messages stuff below
set_hudmessage(0, 255, 0, 0.35, 0.8, _, _, MSG_TIME)
new message[128], c_name[32], r_name[32]
get_user_name(carrier, c_name, 31)
get_user_name(recipient, r_name, 31)
format(message, 127, "[SERVER] Бомба передана ^"%s^", т.к ^"%s^" AFK", r_name, c_name)
for (new i = 0; i < num; ++i)
show_hudmessage(id[i], "%s", message)

set_hudmessage(255, 255, 0, 0.42, 0.3, _, _, MSG_TIME, _, _, 3)
show_hudmessage(recipient, "[SERVER] Теперь бомба у вас!")
}

/* **************************************************** EOF **************************************************** */


В самый низ плагина добавляеш это:
Сток цветных сообщений

CODE
stock colored_print( target, const message[], any:... )
{
static buffer[ 512 ]

if( !target )
{
static player
for( player = 1; player <= g_maxplayers; player++ )
{
if ( !is_user_connected( player ) )
continue;

vformat( buffer, charsmax( buffer ), message, 3 )

message_begin( MSG_ONE_UNRELIABLE, g_msgSayText, _, player )
write_byte( player )
write_string( buffer )
message_end()
}
}

else
{
vformat( buffer, charsmax( buffer ), message, 3 )

message_begin( MSG_ONE, g_msgSayText, _, target )
write_byte( target )
write_string( buffer )
message_end()
}
}



далее ВОТ ЭТО:

Скрытый текст
Код
set_hudmessage(255, 255, 0, 0.42, 0.3, _, _, MSG_TIME, _, _, 3)
show_hudmessage(recipient, "[SERVER] Теперь бомба у вас!")



Заменяешь на это:

Скрытый текст
Код
colored_print(recipient, "^x01[^x04SERVER^x01]^x03 Теперь бомба у вас!")



это:

Скрытый текст
Код
show_hudmessage(id[i], "%s", message)



на:

Скрытый текст
Код
colored_print(id[i], "^x01[^x04SERVER^x01] ^x03Бомба передана ^x04%s^x01, т.к. ^x04%s ^x01AFK", r_name, c_name)



короче там еще удалять надо. на вот держи готовое, разберешься. Цвета: ^x01(желтый), ^x03(цвет команды), ^x04(зеленый).

AFK Bomb Transfer

Код:

/* AMX Mod X
* AFK Bomb Transfer
*
* © Copyright 2006 by VEN
*
* This file is provided as is (no warranties)
*
* DESCRIPTION
* Plugin allow transfer bomb from AFK terrorist to closest non-AFK teammate.
* Plugin will have no effect:
* - at the freezetime
* - if bomb is planting
* - on non-bomb maps (comment #define BOMB_MAP_CHECK to suppress)
*
* MODULES
* fakemeta
*
* CVARS
* afk_bombtransfer_spawn (N: seconds, default: 7) - max. allowed bomb carrier AFK time
* affects on spawned AFK bomb carrier which never moved after spawn
*
* afk_bombtransfer_time (N: seconds, default: 15) - max. allowed bomb carrier AFK time
* affects on any AFK bomb carrier except one which obey previous CVAR
*
* HUD MESSAGES
* Terrorist team (green color)
* Bomb transferred to "NEW_CARRIER_NAME"
* since "AFK_CARRIER_NAME" is AFK
*
* New bomb carrier (yellow color)
* You got the bomb!
*
* Note: by defult message display time is 7 seconds (define MSG_TIME)
*
* VERSIONS
* 0.4 backpack transfer method greatly improved
* added pcvar natives support (backward compatibility saved)
* few code optimization
* 0.3 now fakemeta instead of engine required (efficiency++ if engine is disabled)
* "non-bomb map" check can be disabled (//#define BOMB_MAP_CHECK)
* backpack finding method improved
* few code optimization
* added comments to the plugin source code
* 0.2 fixed format issue
* code optimized
* description improved
*
* 0.1 first release
*/

/* *************************************************** Init **************************************************** */

#include <amxmodx>
#include <fakemeta>

// plugin's main information
#define PLUGIN_NAME "AFK Bomb Transfer"
#define PLUGIN_VERSION "0.4"
#define PLUGIN_AUTHOR "VEN"

// comment to avoid autodisabling the plugin on maps which not contain bomb targets
#define BOMB_MAP_CHECK

// float value, hud messages display time (in seconds)
#define MSG_TIME 7.0

// CVAR name, affects on spawned AFK bomb carrier which never moved after spawn
new CVAR_SPAWN[] = "afk_bombtransfer_spawn"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_SPAWN[] = "7"

// CVAR name, affects on any AFK bomb carrier except one which obey previous CVAR
new CVAR_TIME[] = "afk_bombtransfer_time"

// CVAR value, max. allowed bomb carrier AFK time (in seconds)
new DEFAULT_TIME[] = "15"

// do not set this value less than "maxplayers"
#define MAX_PLAYERS 32

// initial AMXX version number supported CVAR pointers in get/set_pcvar_* natives
#define CVAR_POINTERS_AMXX_INIT_VER_NUM 170

// determine if get/set_pcvar_* natives can be used
#if defined AMXX_VERSION_NUM && AMXX_VERSION_NUM >= CVAR_POINTERS_AMXX_INIT_VER_NUM
#define CVAR_POINTERS
new g_pcvar_spawn
new g_pcvar_time
#endif

new TEAM[] = "TERRORIST"
new WEAPON[] = "weapon_c4"

#define FL_ONGROUND (1<<9)

new bool:g_freezetime = true
new bool:g_spawn
new bool:g_planting

new g_carrier

new g_pos[MAX_PLAYERS + 1][3]
new g_time[MAX_PLAYERS + 1]

new g_maxplayers

public plugin_init() {
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)

#if defined CVAR_POINTERS
g_pcvar_spawn = register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
g_pcvar_time = register_cvar(CVAR_TIME, DEFAULT_TIME)
#else
register_cvar(CVAR_SPAWN, DEFAULT_SPAWN)
register_cvar(CVAR_TIME, DEFAULT_TIME)
#endif

#if defined BOMB_MAP_CHECK
// is current map not contain bomb targets?
if (!engfunc(EngFunc_FindEntityByString, -1, "classname", "func_bomb_target"))
return
#endif

register_event("WeapPickup", "event_got_bomb", "be", "1=6")
register_event("BarTime", "event_bar_time", "be")
register_event("TextMsg", "event_bomb_drop", "bc", "2=#Game_bomb_drop")
register_event("TextMsg", "event_bomb_drop", "a", "2=#Bomb_Planted")
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

register_logevent("logevent_round_start", 2, "1=Round_Start")

set_task(1.0, "task_afk_check", _, _, _, "b") // plugin's core loop

g_maxplayers = get_maxplayers()
}

/* *************************************************** Base **************************************************** */

public event_new_round() {
g_freezetime = true
g_spawn = true
g_planting = false
g_carrier = 0
}

public event_got_bomb(id) {
g_carrier = id
}

public event_bar_time(id) {
if (id == g_carrier) {
g_planting = bool:read_data(1)
get_user_origin(id, g_pos[id])
g_time[id] = 0
}
}

public event_bomb_drop() {
g_spawn = false
g_planting = false
g_carrier = 0
}

public logevent_round_start() {
new id[32], num
get_players(id, num, "ae", TEAM)

if (!num) // is server empty?
return

g_freezetime = false

// update afk timers and current positions
new x
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, g_pos[x])
g_time[x] = 0
}
}

public task_afk_check() {
if (g_freezetime) // is freezetime right now?
return

// afk check
new id[32], num, x, origin[3]
get_players(id, num, "ae", TEAM)
for (new i = 0; i < num; ++i) {
x = id[i]
get_user_origin(x, origin)
if (origin[0] != g_pos[x][0] || origin[1] != g_pos[x][1] || (x == g_carrier && g_planting)) {
g_time[x] = 0
g_pos[x][0] = origin[0]
g_pos[x][1] = origin[1]
if (g_spawn && x == g_carrier)
g_spawn = false
}
else
g_time[x]++
}

// is bomb not currently carried or Ts number less than 2?
if (!g_carrier || num < 2)
return

#if defined CVAR_POINTERS
new max_time = get_pcvar_num(g_spawn ? g_pcvar_spawn : g_pcvar_time)
#else
new max_time = get_cvar_num(g_spawn ? CVAR_SPAWN : CVAR_TIME)
#endif

// is plugin disabled (cvar <= 0) or carrier isn't afk?
if (max_time <= 0 || g_time[g_carrier] < max_time)
return

// find who from non-afk Ts is the closest to the afk carrier
get_user_origin(g_carrier, origin)
new min_dist = 9999999, dist, recipient, origin2[3]
for (new i = 0; i < num; ++i) {
x = id[i]
if (g_time[x] < max_time) {
get_user_origin(x, origin2)
dist = get_distance(origin, origin2)
if (dist < min_dist) {
min_dist = dist
recipient = x
}
}
}

if (!recipient) // is all Ts afk?
return

new carrier = g_carrier
engclient_cmd(carrier, "drop", WEAPON) // drop the backpack
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", WEAPON) // find weapon_c4 entity
if (!c4)
return

new backpack = pev(c4, pev_owner) // get backpack entity
if (backpack <= g_maxplayers)
return

// my backpack transfer trick (improved)
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)

// hud messages stuff below
new c_name[32], r_name[32]
get_user_name(carrier, c_name, 31)
get_user_name(recipient, r_name, 31)
for (new i = 0; i < num; ++i)

colored_print(id[i], "^x01[^x04SERVER^x01] ^x03Бомба передана ^x04%s^x01, т.к. ^x04%s ^x01AFK", r_name, c_name)

colored_print(recipient, "^x01[^x04SERVER^x01]^x03 Теперь бомба у вас!")

}

stock colored_print( target, const message[], any:... )
{
static buffer[ 512 ]

if( !target )
{
static player
for( player = 1; player <= g_maxplayers; player++ )
{
if ( !is_user_connected( player ) )
continue;

vformat( buffer, charsmax( buffer ), message, 3 )

message_begin( MSG_ONE_UNRELIABLE, g_msgSayText, _, player )
write_byte( player )
write_string( buffer )
message_end()
}
}

else
{
vformat( buffer, charsmax( buffer ), message, 3 )

message_begin( MSG_ONE, g_msgSayText, _, target )
write_byte( target )
write_string( buffer )
message_end()
}
}

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