Проверенный
Пользователь
- Сообщения
- 1,536
- Реакции
- 2,326
- Помог
- 39 раз(а)
Можно еще использовать https://yapb.jeefo.net/
Или https://github.com/CCNHsK-Dev/SyPB (Только Windows)
Или https://github.com/CCNHsK-Dev/SyPB (Только Windows)
Разное поведение. По моим ощущениям боты YaPB сложнее CSBot'ов, и больше похожи на живых игроков.Emilyfayri, чем не угодили стандартные боты?
Спасибо, реакция у бота улучшилась, но он, по-прежнему, предпочитает отсиживаться в углу боком или спиной ко мне (( Хотя, первые несколько раундов сам выходил, а потом всё опять испортилось. Карта cs_assault.
Спасибо! Я поняла проблему, буду искать. Называется, начала использовать игровую мышь, сразу скилл повысилсяEmilyfayri, находите в интернете исправленные навигации для ботов для этих же карт, где вырезаны все ненужные кемперские места для ботов, которые создаются автоматом при анализе карты. Или сами редактируйте и убирайте ненужные вам кемперские места.
Поищите тут: https://gamebanana.com/gamefiles/cats/4428
Раньше он был отдельно. Потом его просто добавили в ReGameDLL.Первый вопрос не глупый, а скорее, некорректный. Я имею в виду, не оформлял ли кто-нибудь CSBot отдельным от mp.dll файлом библотеки?
1) Да1. Отличается ли ИИ бота для CS Source от бота для CS1.6?
2. И пытался ли кто-нибудь перенести бота из CSS в CS1.6?
Спасибо за ответ. Надо полагать, здесь, на сайте есть старые версии. Мне просто интересно ))Раньше он был отдельно. Потом его просто добавили в ReGameDLL.
Искала, уже не раз, ничего не нашла.2) Не знаю. Попробуйте погуглить..
CSBot, CZBots - это всё взято на прямую из CS:Condition Zero.оформлял ли кто-нибудь CSBot отдельным от mp.dll файлом библотеки?
//
// engine_api.cpp
//
// Implementation of Half-Life engine functions
//
#include "main.h"
#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
int pfnPrecacheModel(char* s) {
if (strncmp(s, "models/hostage", 14) == 0 ||
strstr(s, "spetsnaz") != NULL ||
strstr(s, "militia") != NULL) {
RETURN_META_VALUE(MRES_SUPERCEDE, g_engfuncs.pfnPrecacheModel("models/hostage.mdl"));
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
int pfnPrecacheSound(char* s) {
if (strncmp(s, "hostage/", 8) == 0) {
static int i = 0;
switch (i++ % 5) {
case 0:
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnPrecacheSound)("hostage/hos1.wav"));
case 1:
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnPrecacheSound)("hostage/hos2.wav"));
case 2:
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnPrecacheSound)("hostage/hos3.wav"));
case 3:
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnPrecacheSound)("hostage/hos4.wav"));
case 4:
default:
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnPrecacheSound)("hostage/hos5.wav"));
}
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void pfnSetModel(edict_t *e, const char *m) {
if (strncmp(m, "models/hostage", 14) == 0) {
g_engfuncs.pfnSetModel(e, "models/hostage.mdl");
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
int pfnModelIndex(const char *m) {
if (strncmp(m, "models/hostage", 14) == 0) {
RETURN_META_VALUE(MRES_SUPERCEDE, g_engfuncs.pfnModelIndex("models/hostage.mdl"));
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void pfnEmitSound(edict_t *entity, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch) {
if (strncmp(sample, "hostage/", 8) == 0) {
if (strncmp(sample, "hostage/huse/", 13) == 0) {
switch (rand() % 5) {
case 0:
(*g_engfuncs.pfnEmitSound)(entity, channel, "hostage/hos1.wav", volume, attenuation, fFlags, pitch);
break;
case 1:
(*g_engfuncs.pfnEmitSound)(entity, channel, "hostage/hos2.wav", volume, attenuation, fFlags, pitch);
break;
case 2:
(*g_engfuncs.pfnEmitSound)(entity, channel, "hostage/hos3.wav", volume, attenuation, fFlags, pitch);
break;
case 3:
(*g_engfuncs.pfnEmitSound)(entity, channel, "hostage/hos4.wav", volume, attenuation, fFlags, pitch);
break;
case 4:
default:
(*g_engfuncs.pfnEmitSound)(entity, channel, "hostage/hos5.wav", volume, attenuation, fFlags, pitch);
break;
}
}
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
byte *pfnLoadFileForMe(char *filename, int *pLength) {
int length = strlen(filename);
if (strcmp(&filename[length - 4], ".nav") == 0) {
int i = length;
while (i > 0 && filename[i] != '/' && filename[i] != '\\')
i--;
if (i > 0)
i++;
#ifndef __linux__
if (access(va("czero\\maps\\%s", &filename[i]), 0) != -1) {
#else
if (access(va("czero/maps/%s", &filename[i]), 0) != -1) {
#endif
RETURN_META_VALUE(MRES_SUPERCEDE, (*g_engfuncs.pfnLoadFileForMe)(va("../czero/maps/%s", &filename[i]), pLength));
}
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void pfnGetGameDir(char *szGetGameDir) {
strcpy(szGetGameDir, "czero");
RETURN_META(MRES_SUPERCEDE);
}
void pfnSetClientKeyValue(int clientIndex, char *infobuffer, char *key, char *value) {
if (strcmp(key, "model") == 0) {
if (strcmp(value, "spetsnaz") == 0) {
char *models[] = {"urban", "gsg9", "sas", "gign"};
g_engfuncs.pfnSetClientKeyValue(clientIndex, infobuffer, key, models[rand() % 4]);
RETURN_META(MRES_SUPERCEDE);
} else if (strcmp(value, "militia") == 0) {
char *models[] = {"terror", "leet", "arctic", "guerilla"};
g_engfuncs.pfnSetClientKeyValue(clientIndex, infobuffer, key, models[rand() % 4]);
RETURN_META(MRES_SUPERCEDE);
}
}
RETURN_META(MRES_IGNORED);
}
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine,
int *interfaceVersion)
{
pengfuncsFromEngine->pfnPrecacheModel = pfnPrecacheModel;
pengfuncsFromEngine->pfnPrecacheSound = pfnPrecacheSound;
pengfuncsFromEngine->pfnSetModel = pfnSetModel;
pengfuncsFromEngine->pfnModelIndex = pfnModelIndex;
pengfuncsFromEngine->pfnEmitSound = pfnEmitSound;
pengfuncsFromEngine->pfnLoadFileForMe = pfnLoadFileForMe;
pengfuncsFromEngine->pfnGetGameDir = pfnGetGameDir;
pengfuncsFromEngine->pfnSetClientKeyValue = pfnSetClientKeyValue;
return TRUE;
}