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

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

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

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

История благодарностей участнику Tarum ::: Спасибо сказали: 15
Дата поста: В теме: За сообщение: Спасибо сказали:
10.11.2015, 21:18 Zbot 1.5 для Linux сервера
Подробный мануал пишу впервые, прошу сильно не пинать.

ZBot - это не официальное название бота Official CSBot (официальный бот для Counter-Strike Condition Zero). Когда-то давно он был (да и есть даже сейчас) в первых версиях Counter-Strike 1.6 Beta. Оба игровых мода используют одну и туже библиотеку - mp.dll / cs.so (cs_i386.so) для Windows и Linux соответственно. Если быть точнее, то данные библиотеки для CS 1.6 и CS Condition Zero полностью идентичны. Вот в них-то сам бот и находится, только запускается он если запущен мод Condition Zero, а в 1.6 не работает. Для того, что бы бот запустился для CS 1.6, внутри библиотеки через любой Hex-редактор меняется идентификатор мода и производятся другие манипуляции.
Что нужно для установки:

1) Установленный сервер cs 1.6 на Linux (Мой билд 6153)
2) Установленный метамод (Протестировано на metamod-p-1.21p37 взять можно отсюда)
Работа ботов стабильна так же при включенном AmxModX 1.8.2
3) Файлы из аттачмента, а именно: [attachment=36574:csbot_enable_mm.rar] и [attachment=36573:BotProfile.rar]
(Важно! Ваш фтп клиент при заказчке может автоматически переводить названия файлов в нижний регистр, в таком случае необходимо будет привести название файла BotProfile.db к изначальному виду с двумя заглавными!)
4) SSH/FTP доступ к вашему серверу

Управление ботами

bot_add - добавить бота (опционально можно писать ники)
bot_add_t - добавить за Т
bot_add_ct - добавить за СТ
bot_kill all - убить всех ботов
bot_kill name - убить бота
bot_kick all - кикнуть всех ботов, можно указать ник, но у меня по нику не кикает почему-то

cvar 'ы в server.cfg
Полный список ссылка

Цитата
//Сложность ботов 0-3
bot_difficulty 2

//Боты на кол-во игроков. При значении 4, при заходе 1 игрока будет 4 бота.
//bot_quota_match 1

//Освобождать места для игроков при заполнении сервера
bot_auto_vacate 1

//Префикс ботов в игре
bot_prefix [zBot]

//За какую команду могут заходить боты ct t any
bot_join_team any

//Боты появляются только при заходе игрока 1 0
bot_join_after_player 0

//Общения в чате и по радио. Лучше вообще вырубать.
bot_chatter off

//Управление снаряжением ботов.
//Допустимые значения 1 и 0.
//bot_knives_only
//bot_pistols_only
//bot_snipers_only
//bot_all_weapons
//bot_allow_pistols
//bot_allow_shotguns
//bot_allow_sub_machine_guns
bot_allow_rifles 0
//bot_allow_snipers
//bot_allow_machine_guns
//bot_allow_grenades
bot_allow_shield 0

//Максимальное кол-во ботов которое может быть на сервере.
bot_quota 10

Баг с уроном и радиусом поражения гранат у ботов

Юзеры так же доложили о том, что есть баг у ботов с гранатами, решить это можно двумя способами.
1. Использовать квар на запрещение использования гранат у ботов bot_allow_grenades 0
2. Для тех кто решил пойти путем джедая юзер MisterFake написал плагин который фиксит этот баг, за что ему отдельное спасибо.
Код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

#define PLUGIN "HE Damage Fix"
#define VERSION "0.1"
#define AUTHOR "Denis Yuriev"

#define DMG_HEGRENADE (1<<24)

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
RegisterHam(Ham_TakeDamage,"player","hefix",0)
register_cvar("amx_hefix", "0")
}

public hefix(victim, weapon, attacker, Float:damage, damagebits) {
if(damagebits != DMG_HEGRENADE)
return
new Float:hedmg=(get_cvar_num("amx_hefix") == 1) ? 0.6667 : 1.0
SetHamParamFloat(4, damage * hedmg)
}

CVAR в server.cfg
amx_hefix 0 - 1/0 включить/выключить исправление урона от гранат

Реальный PING для ботов
По умолчанию у ботов вместо пинга будет надпись BOT.
Чтобы ее заменить на эмулятор пинга, Вы можете воспользоваться плагином (AMX) Ping Fucker
у меня ошибок не выдает, но пока нихрена пинг не заменяет но больше никто не жаловался, поэтому пока курю на тему из-за чего не работает..

Поместить [attachment=36575:fakepings.rar] в addons/amxmodx/configs/

CVAR amxx.cfg
pingfake_enable 1 - Вкл/Выкл (1/0)
pingfake_ping 25 - Пинг (min: 0 // max: 4095)
pingfake_flux 7 - В каком диапозоне будет меняться (0 = будет статичный)
pingfake_bots 2 - 2 Только боты, 0 все, 1 хз


Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

new const FAKEPINGS_FILE[] = "fakepings.ini"
const TASK_ARGUMENTS = 100

new cvar_enable, cvar_ping, cvar_flux, cvar_target, cvar_bots, cvar_multiplier, cvar_fileonly, cvar_showactivity
new g_maxplayers, g_connected[33], g_isbot[33], g_argping[33]
new g_loaded_counter, g_pingoverride[33] = { -1, ... }
new Array:g_loaded_authid, Array:g_loaded_ping

public plugin_init()
{
register_plugin("Ping Faker", "1.5a", "MeRcyLeZZ")

cvar_enable = register_cvar("pingfake_enable", "1")
cvar_ping = register_cvar("pingfake_ping", "1337")
cvar_flux = register_cvar("pingfake_flux", "0")
cvar_target = register_cvar("pingfake_target", "1")
cvar_bots = register_cvar("pingfake_bots", "0")
cvar_multiplier = register_cvar("pingfake_multiplier", "0.0")
cvar_fileonly = register_cvar("pingfake_fileonly", "0")
cvar_showactivity = get_cvar_pointer("amx_show_activity")

g_maxplayers = get_maxplayers()

// If mod is CS, register some additional events to fix a bug
new mymod[16]
get_modname(mymod, charsmax(mymod))
if (equal(mymod, "cstrike") || equal(mymod, "czero"))
{
register_event("DeathMsg", "fix_fake_pings", "a")
register_event("TeamInfo", "fix_fake_pings", "a")
}

register_forward(FM_UpdateClientData, "fw_UpdateClientData")

register_concmd("amx_fakeping", "cmd_fakeping", ADMIN_KICK, "<target> <ping> - Toggle fake ping override on player (-1 to disable)")

g_loaded_authid = ArrayCreate(32, 1)
g_loaded_ping = ArrayCreate(1, 1)

// Load list of IP/SteamIDs to fake pings for
load_pings_from_file()

// Calculate weird argument values regularly in case we are faking ping fluctuations or a multiple of the real ping
set_task(2.0, "calculate_arguments", TASK_ARGUMENTS, _, _, "b")
}

// After some events in CS, the fake pings are overriden for some reason, so we have to send them again...
public fix_fake_pings()
{
static player
for (player = 1; player <= g_maxplayers; player++)
{
// Player not in game?
if (!g_connected[player])
continue;

// Resend fake pings
fw_UpdateClientData(player)
}
}

public client_authorized(id)
{
check_for_loaded_pings(id)
}

public client_putinserver(id)
{
g_connected[id] = true
if (is_user_bot(id)) g_isbot[id] = true
check_for_loaded_pings(id)
}

public client_disconnect(id)
{
g_connected[id] = false
g_isbot[id] = false
g_pingoverride[id] = -1
}

public fw_UpdateClientData(id)
{
// Ping faking disabled?
if (!get_pcvar_num(cvar_enable)) return;

// Scoreboard key being pressed?
if (!(pev(id, pev_button) & IN_SCORE) && !(pev(id, pev_oldbuttons) & IN_SCORE))
return;

// Send fake player's pings
static player, sending, bits, bits_added
sending = false
bits = 0
bits_added = 0

for (player = 1; player <= g_maxplayers; player++)
{
// Player not in game?
if (!g_connected[player])
continue;

// Fake latency for its target too?
if (!get_pcvar_num(cvar_target) && id == player)
continue;

// Fake pings enabled for players on .INI file ONLY and this guy is not listed
if (get_pcvar_num(cvar_fileonly) && g_pingoverride[player] < 0)
continue;

// Only do these checks if not overriding ping for player
if (g_pingoverride[player] < 0)
{
// Is this a bot?
if (g_isbot[player])
{
// Bots setting disabled?
if (!get_pcvar_num(cvar_bots)) continue;
}
else
{
// Bots only setting?
if (get_pcvar_num(cvar_bots) == 2) continue;
}
}

// Start message
if (!sending)
{
message_begin(MSG_ONE_UNRELIABLE, SVC_PINGS, _, id)
sending = true
}

// Add bits for this player
AddBits(bits, bits_added, 1, 1) // flag = 1
AddBits(bits, bits_added, player-1, 5) // player-1 since HL uses ids 0-31
AddBits(bits, bits_added, g_argping[player], 12) // ping
AddBits(bits, bits_added, 0, 7) // loss

// Write group of 8 bits (bytes)
WriteBytes(bits, bits_added, false)
}

// End message
if (sending)
{
// Add empty bit at the end
AddBits(bits, bits_added, 0, 1) // flag = 0

// Write remaining bits
WriteBytes(bits, bits_added, true)

message_end()
}
}

public cmd_fakeping(id, level, cid)
{
// Check for access flag
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED;

// Retrieve arguments
static arg[32], player, ping
read_argv(1, arg, sizeof arg - 1)
player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)
read_argv(2, arg, sizeof arg - 1)
ping = str_to_num(arg)

// Invalid target
if (!player) return PLUGIN_HANDLED;

// Update ping overrides for player
g_pingoverride[player] = min(ping, 4095)

// Get player's name for displaying/logging activity
static name1[32], name2[32]
get_user_name(id, name1, sizeof name1 - 1)
get_user_name(player, name2, sizeof name2 - 1)

// Negative value means disable fakeping
if (ping < 0)
{
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - fake ping override disabled on %s", name2)
case 2: client_print(0, print_chat, "ADMIN %s - fake ping override disabled on %s", name1, name2)
}

// Log activity
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - fake ping override disabled on %s", name1, authid, ip, name2)
log_amx(logdata)
}
else
{
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - fake ping override of %d enabled on %s", ping, name2)
case 2: client_print(0, print_chat, "ADMIN %s - fake ping override of %d enabled on %s", name1, ping, name2)
}

// Log activity
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - fake ping override of %d enabled on %s", name1, authid, ip, ping, name2)
log_amx(logdata)
}

return PLUGIN_HANDLED;
}

// Calculate argument values based on target ping
public calculate_arguments()
{
static player, ping, loss
for (player = 1; player <= g_maxplayers; player++)
{
// Calculate target ping (clamp if out of bounds)
if (g_pingoverride[player] < 0)
{
if (get_pcvar_float(cvar_multiplier) > 0.0)
{
get_user_ping(player, ping, loss)
g_argping[player] = clamp(floatround(ping * get_pcvar_float(cvar_multiplier)), 0, 4095)
}
else
g_argping[player] = clamp(get_pcvar_num(cvar_ping) + random_num(-abs(get_pcvar_num(cvar_flux)), abs(get_pcvar_num(cvar_flux))), 0, 4095)
}
else
g_argping[player] = g_pingoverride[player]
}
}

load_pings_from_file()
{
// Build file path
new path[64]
get_configsdir(path, sizeof path - 1)
format(path, sizeof path - 1, "%s/%s", path, FAKEPINGS_FILE)

// File not present, skip loading
if (!file_exists(path)) return;

// Open file for reading
new linedata[40], authid[32], ping[8], file = fopen(path, "rt")

while (file && !feof(file))
{
// Read one line at a time
fgets(file, linedata, sizeof linedata - 1)

// Replace newlines with a null character to prevent headaches
replace(linedata, sizeof linedata - 1, "^n", "")

// Blank line or comment
if (!linedata[0] || linedata[0] == ';') continue;

// Get authid and ping
strbreak(linedata, authid, sizeof authid - 1, ping, sizeof ping -1)
remove_quotes(ping)

// Store data into global arrays
ArrayPushString(g_loaded_authid, authid)
ArrayPushCell(g_loaded_ping, clamp(str_to_num(ping), 0, 4095))

// Increase loaded data counter
g_loaded_counter++
}
if (file) fclose(file)
}

check_for_loaded_pings(id)
{
// Nothing to check for
if (g_loaded_counter <= 0) return;

// Get steamid and ip
static authid[32], ip[16], i, buffer[32]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)

for (i = 0; i < g_loaded_counter; i++)
{
// Retrieve authid
ArrayGetString(g_loaded_authid, i, buffer, sizeof buffer - 1)

// Compare it with this player's steamid and ip
if (equali(buffer, authid) || equal(buffer, ip))
{
// We've got a match!
g_pingoverride[id] = ArrayGetCell(g_loaded_ping, i)
break;
}
}
}

AddBits(&bits, &bits_added, value, bit_count)
{
// No more room (max 32 bits / 1 cell)
if (bit_count > (32 - bits_added) || bit_count < 1)
return;

// Clamp value if its too high
if (value >= (1 << bit_count))
value = ((1 << bit_count) - 1)

// Add new bits
bits = bits + (value << bits_added)
// Increase bits added counter
bits_added += bit_count
}

WriteBytes(&bits, &bits_added, write_remaining)
{
// Keep looping if there are more bytes to write
while (bits_added >= 8)
{
// Write group of 8 bits
write_byte(bits & ((1 << 8) - 1))

// Remove bits we just sent by moving all bits to the right 8 times
bits = bits >> 8
bits_added -= 8
}

// Write remaining bits too?
if (write_remaining && bits_added > 0)
{
write_byte(bits)
bits = 0
bits_added = 0
}
}



Установка ботов на сервер Linux
Прежде всего необходимо разблокировать самих ботов для cs. Для этого нужно установить metamod плагин:

Цитата
Заливаем csbot_enable_mm.so в папку addons/metamod/


Пишем в конец файла plugins.ini (создаем при отсутствии):

Цитата
linux addons/metamod/csbot_enable_mm.so


При создании ботов, Вы можете получить ошибку no profile exists и all bot profiles at this difficulty level are in use.
Чтобы этого не было:

Цитата
Файл с профилями ботов BotProfile.db необходимо поместить в корень папки /cstrike (!Соблюдая регистр названия файла!)


Для корректной работы вам необходимо в папке с hlds_run создать папки /czero/maps
Именно там боты будут в будущем хранить свои навигационные данные к картам. P.S. по идее оно должно создаваться все само, но у меня этого не произошло из-за чего валились ошибки.
Поэтому я создал необходимые директории сам и выстовил права.
!Важно! Папка /czero/maps должна иметь Права на запись (chmod 777)

Цитата
$ cd /home/имя_вашего_юзера/папка_с_сервером_hlds/
$ mkdir czero
$ mkdir czero/map
$ chmod 777 czero/maps


Теперь открываем server.cfg и прописываем в конце (в дальнейшем вы отредактируете конфиг под себя), сохраняем и выходим:

Цитата
bot_difficulty 2
bot_prefix "[zbot]"
bot_chatter off
bot_quota 1


И так последний шаг, осталось создать навигационные файлы для ботов. Процедура не сложная, и так:
Запускаем сервер с параметром +map de_dust (или другой карты для которой надо сделать навигацию, вообще для каждой карты на которой будут боты нужно такое сделать один раз)
После прогрузки, если Вы все сделали правильно, нужно дождаться следующей надписи (не сразу скорее всего):


Цитата
Connection to Steam servers successful.
VAC secure mode disabled.
Connecting navigation areas...
Merging navigation areas...


Как только она появилась, значит боты создали себе карту, теперь ее надо сохранить.
Пишем в консоле:

Цитата
bot_nav_save [Enter]
Size of bsp file 'maps\de_inferno.bsp' is 6269880 bytes.
Navigation map 'czero/maps/de_inferno.nav' saved.


Если вы увидели запись выше (я делал на инферно, но с даст2 будет похоже), теперь перегружаем карту и спавним ботов, они бегают и улыбаются вам и вашим друзьям))

Как по мне очень удобно, что можно на кв сервер подключить только метамод и поставить этот плагин для тренировки команды...

Статья была подготовлена на основе материалов из смежных тем: Про пинг и Модуль Zbot
Отдельное спасибо за вклад в развитие ботов на серверах пользователям: Safety1st за сошку и MisterFake за fix плагин


p.S. Статья еще не закончена...
evil, OnlySteam, Safety1st, TheArtemMaps
6.11.2015, 14:15 Продам Valve Complete pack
Купил 1 пак, все гуд.
delett
15.4.2012, 13:19 Зациклить процесс HLDS
А как обычно спросони все через Ж делаю)
вот в общем скриптик мож кому понадобится

Код
#!/bin/sh      
      while true; do      
      ./hlds_run -binary ./hlds_i686 -game cstrike +maxplayers скоко_плееров +map карта +ip ваш_ип +port номер_порта +sys_ticrate ваш_тикрейт -pingboost 3 +exec server.cfg +log off -pidfile server.pid(это пока сервак работает в папке с серваком пид файл лежать будет)
done


Для перезагрузки юзаем rcon quit :)
JIokoMoTuB, L_O_T_U_S, Skillax, sokolteam
31.3.2012, 14:30 Скрипт запуска HLDS-серверов + Source NEW
разрулил вопрос.
Короче дело было в том, что название сервера скринсессии щас во втором скрипте я писал цифрами и он не мог завершить, если пишешь буквами, то завершает нормально) закомментировать надо чутка и переписать скриптулю, вопрос снят, надеюсь кому то поможет эта инфа)
sokolteam
16.12.2011, 19:02 work.sma
Код
public MySql_Init()
{
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db);
    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error));
    if(SqlConnection == Empty_Handle)
        set_fail_state(g_Error);
          
    new Handle:Queries;
    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS pl_data (pl_name varchar(32),pl_xp INT(11),pl_lvl INT(11))");
    if(!SQL_Execute(Queries))
    {
        SQL_QueryError(Queries,g_Error,charsmax(g_Error));
        set_fail_state(g_Error);
    }
    SQL_FreeHandle(Queries);
    SQL_FreeHandle(SqlConnection) ;
}
vladislav96
16.12.2011, 14:18 work.sma
Заглянул в код, Ну в общем создаешь базу итп, создаешь юзера для нее, в самом сма прописываешь доступ к базе и все. он сам создаст нужные таблицы, если их нет.
На счет чата не понял, что повторяется?
vladislav96
29.11.2011, 7:44 CSDM сервер - конфигурация
По первому пункту:
Неограниченный боезапас идет изначально.
Блокировка вепона на ксдм моде делается следующим образом
Инструкция

открыть /addons/amxmodx/configs/csdm.cfg
Найти
//Примерно 129 строка
;;;;;;;;;;;;;;;;
;;WEAPON MENUS;;
;;;;;;;;;;;;;;;;
там будет нечто

[secondary]
usp USP 0
glock18 Glock 1
deagle Deagle 1
p228 P228 1
elite Elite 1
fiveseven "Five Seven" 1

Здесь указано что выводиться в buymenu. Заметь НОЛЬ рядом с USP, что в свою очередь означает, что успа будет убрана из вепон меню. Так что просто ставишь вместо единицы ноль рядом с тем орежием, которое должно быть выключено.
Если я правильно понял тебе надо после [primary] везде 0 поставить)


на счет спавна итемов они находятся тут: addons/amxmodx/configs/csdm/items/ кфг файлы мап. Синтаксис там довольно простой. [Что дропать] [координаты для дропа]. К сожалению плагина для спавна итемов я не знаю, но думаю тебе в этом поможет встроенный в ксдм мод спавн эдитор.
gremlen
24.11.2011, 23:06 Проблема при запуске сервера
в строке запуска добавьте параметр -debug и скиньте сюда лог, тогда можно будет точно сказать из-за чего падает сервер.
shumik037