10 мая, 2015 bullet28 сделай авто-баланс (по равному количеству игроков по обе тимы) для BCM Versus2. В кой то веки зашел поиграть сегодня, а люди скачут как креветки из одной тимы в другую 12 на 6 не очень уютно играется. Да и самому приходиться скакать туда сюда. Потому что заходишь поиграть а не наблюдать как тебя и всю мизерную команду раскатывает толпа заразы. 2 Поделиться сообщением Ссылка на сообщение
14 мая, 2015 С карты CityHall всегда выкидывает, не успеваешь выйти из общаги >:( помогает только смена карты... Разберитесь пожалуйста :dntknw: Поделиться сообщением Ссылка на сообщение
14 мая, 2015 не только на этой карте, еще в нескольких компаниях такое..просто выкидывает на раб. стол всех Поделиться сообщением Ссылка на сообщение
14 мая, 2015 Заметил на всех картах такая штука если авп не видимым становится то игра вылетает . Поделиться сообщением Ссылка на сообщение
17 мая, 2015 Версус 8 на 8. Загружается карта, всего за выживших допустим 4 человека, начинается игра остается 4 человека, ботов нет. Когда подключаются еще люди за выживших, они сразу мертвые. Бывает ситуация, что карту проходят выжившие вчетвером без ботов против 8 зараженных, а когда меняются сторонами, то 8 выживших на 8 зараженных, что есть не правильно. И остается проблема с линейками, которые пропадают. Приходится их перебирать через !model. 2 Поделиться сообщением Ссылка на сообщение
18 мая, 2015 Не правильно! Это когда проигравшая команда перебирает линейки через команду !model . Влад, я бы на твоём месте убрал, данную не справедливость :lol3:. Так как это версус! Получается так, команда заражёных слила линейку, тем самым заработала себе очки! Тут же появляется такой трус как BFG, который не может, как подобает мужику признать своё поражение, и начинает перебирать модел. :rofl: Поделиться сообщением Ссылка на сообщение
18 мая, 2015 Да наверное по хорошему каждому игроку в начале раунда как бы понарошку (не менять скин) присваивать какого-то из 4-х персонажей, а там уж какие дойдут такие дойдут, ибо в первом случае получается рандом, во втором на тех, кто "в теме". Поделиться сообщением Ссылка на сообщение
18 мая, 2015 Не правильно! Это когда проигравшая команда перебирает линейки через команду !model . Влад, я бы на твоём месте убрал, данную не справедливость :lol3:. Так как это версус! Получается так, команда заражёных слила линейку, тем самым заработала себе очки! Тут же появляется такой трус как BFG, который не может, как подобает мужику признать своё поражение, и начинает перебирать модел. :rofl: Больной то еще жив. Вы че гоните? Вы до конца сообщение прочитали? Повторю еще, раз 1 не достаточно. Почему из убеги еще не вышли, а линейка уже мертва? Во время раунда подключаются за живых, уже мертвыми, хотя никто не умирал. Кроме того когда кто-то подключается, он может заменить живую линейку, но, так как он подключается мертвым, то и линейка становится мертвой. Какого первая команда может иметь 8 выживших (люди+боты), а вторая проходит туже карту вчетвером (без ботов)? Но нет же, нужно убрать возможность менять персонажей, чтоб просто оставить все косяки как есть. И исключить возможность хоть как-то их исправить самим игрокам, потому что видите ли не все "в теме", и вообще обычно играют с закрытыми глазами и просто тупые, не понимающие как юзать команду !model. :good: Команда смены персонажа нафиг никому не нужна, если сделать нормальные линейки. 5 Поделиться сообщением Ссылка на сообщение
22 мая, 2015 Согласен С Лёхой, все его слова чистая правда, а ты приколист держал бы рот на замке , ты вообще играешь на версусах ? мне кажется нет , и не решай за Буллета что ему делать , сам решит убирать !model или нет , если ты на коопе отвисаешь то на версусы не лезь, всё что ты там можешь это показать какой ты вип или нуб, випки согласен украшают нуба, но всё равно этот человек с випкой остается нубом, по скелету мне тоже сначала казалось что он просто випарский нуб, но когда я посмортел за его игрой, оказалось всё иначе, короче Приколист сиди и помалкивай Поделиться сообщением Ссылка на сообщение
24 мая, 2015 Сделайте уже что ни будь с серверами, играть просто не возможно, сплошное слайдшоу. Кастомы все лагают, при том что один из них не работает, я конечно не разбираюсь... но предположу что нагрузки на сервера должно быть меньше если один не работает. Что немаловажно, людей не так много, а плавности в игре нету(( Очень расстраивает.Каждый месяц исправно собирается дань, пожертвования в пользу любимого бсм-сервера чтоб жил и процветал, но увы :dntknw: 3 Поделиться сообщением Ссылка на сообщение
26 мая, 2015 Хохохо, как смешно и глупо, не соображаешь в серверах , не лезь, я хоть и не постоянно контролирую свои серверы и не держу их, хотя раньше было такое, но по плагинам знаю всё Поделиться сообщением Ссылка на сообщение
27 мая, 2015 но по плагинам знаю всё Ну ка гений блесни своим IQ. Вот тебе простой sp, что это? И за что он отвечает? Скомбинируй его и выложи! А мы посмотрим тот ли ты! Или просто балабол. #include <sourcemod> #include <sdktools> #define PLUGIN_VERSION "0.1" public Plugin:myinfo = { name = "", author = "", description = "", version = PLUGIN_VERSION, url = "" } public OnMapStart() { SetConVarInt(FindConVar("sb_move") 0); CreateTimer(60.0, NoMove); } public Action:NoMove(Handle:timer) { SetConVarInt(FindConVar("sb_move") 1); } Поделиться сообщением Ссылка на сообщение
28 мая, 2015 Кастом на 12 слотов почему то сильно лагает. Все кастомы лагают Поделиться сообщением Ссылка на сообщение
28 мая, 2015 Вы это, отпишитесь когда сервера в порядочном состоянии будут. Зайду поиграю что ли. Поделиться сообщением Ссылка на сообщение
28 мая, 2015 На коопах при максимальной загрузке сервера(16 и 20 слотов) начинаются мультики, если примерно 3-6 слотов свободно на этих сервах, то все путем. 1 Поделиться сообщением Ссылка на сообщение
28 мая, 2015 Предлагал я тебе свою помощь! Но нет, мы же гордые!)) Поделиться сообщением Ссылка на сообщение
30 мая, 2015 Ну ка гений блесни своим IQ. Вот тебе простой sp, что это? И за что он отвечает? Скомбинируй его и выложи! А мы посмотрим тот ли ты! Или просто балабол. Блеснуть ? та пожалуиста , кратко говоря sp это второй компонент smx , например плагин [L4D2] Defib using bots.smx - позволяет ботам , да да , Ботам, ресать с помощбю дефибрилятора а sp . это доп компонент к smx который позволяет этому плагину работать, скомпилировать ? ща #pragma semicolon 1 #include <sourcemod> #include <sdktools> #define PLUGIN_VERSION "1.5" #define STARTSHOOTING 1 #define STOPSHOOTING 0 static shoot[MAXPLAYERS + 1] = 0; static Handle:MedsArray = INVALID_HANDLE; public Plugin:myinfo = { name = "[L4D2] Defib using bots", author = "DeathChaos25", description = "Allows bots to use Defibrillators in L4D2", version = PLUGIN_VERSION, url = "https://forums.alliedmods.net/showthread.php?t=261566" }; public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) { decl String:s_GameFolder[32]; GetGameFolderName(s_GameFolder, sizeof(s_GameFolder)); if (!StrEqual(s_GameFolder, "left4dead2", false)) { strcopy(error, err_max, "This plugin is for Left 4 Dead 2 Only!"); return APLRes_Failure; } return APLRes_Success; } public OnPluginStart() { CreateConVar("sm_defib_bots_version", PLUGIN_VERSION, "Defib Bots Version", FCVAR_PLUGIN | FCVAR_SPONLY | FCVAR_REPLICATED | FCVAR_NOTIFY); CreateTimer(1.0, BotsDefib, _, TIMER_REPEAT); CreateTimer(3.0, CheckForPickUps, _, TIMER_REPEAT); MedsArray = CreateArray(); HookEvent("defibrillator_used_fail", Event_DefibFailed); HookEvent("defibrillator_interrupted", Event_DefibFailed); HookEvent("defibrillator_used", Event_DefibUsed); RegAdminCmd("sm_resetbots", ResetSurvivorAI, ADMFLAG_ROOT, "Completely Resets Survivor AI"); RegAdminCmd("sm_regroup", RegroupBots, ADMFLAG_ROOT, "Commands Survivor Bots to move to your location"); RegAdminCmd("sm_attack", AttackSI, ADMFLAG_ROOT, "Orders Survivor Bots to Attack the SI you are aiming at"); RegAdminCmd("sm_retreat", RunAway, ADMFLAG_ROOT, "Orders Survivor Bots to retreat from the SI you are aiming at"); } public OnEntityCreated(entity, const String:classname[]) { if (entity <= 0 || entity > 2048 || classname[0] != 'w')return; CreateTimer(2.0, CheckEntityForGrab, entity); } // checking for Defibs for the defib pickup public OnEntityDestroyed(entity) { if (entity <= 0 || entity > 2048)return; if (MedsArray != INVALID_HANDLE) { for (new i = 0; i <= GetArraySize(MedsArray) - 1; i++) { if (entity == GetArrayCell(MedsArray, i)) { RemoveFromArray(MedsArray, i); } } } } // Timer based functions public Action:CheckForPickUps(Handle:Timer) { // trying to account for late loading and unexpected // or unreported weapons (stripper created weapons dont seem to fire OnEntityCreated) if (!IsServerProcessing()) { return; } for (new entity = 0; entity < 2048; entity++) { if (!IsValidEntity(entity)) { continue; } new String:classname[128]; GetEntityClassname(entity, classname, sizeof(classname)); if (StrEqual(classname, "weapon_defibrillator", false) || StrEqual(classname, "weapon_defibrillator_spawn", false) || StrEqual(classname, "weapon_first_aid_kit", false) || StrEqual(classname, "weapon_first_aid_kit_spawn", false)) { if (!IsDefibOwned(entity)) { for (new i = 0; i <= GetArraySize(MedsArray) - 1; i++) { if (entity == GetArrayCell(MedsArray, i)) { return; } } PushArrayCell(MedsArray, entity); } } } } public Action:CheckEntityForGrab(Handle:timer, any:entity) { if (IsValidEntity(entity) && MedsArray != INVALID_HANDLE) { new String:classname[128]; GetEntityClassname(entity, classname, sizeof(classname)); if (StrEqual(classname, "weapon_defibrillator", false) || StrEqual(classname, "weapon_defibrillator_spawn", false) || StrEqual(classname, "weapon_first_aid_kit", false) || StrEqual(classname, "weapon_first_aid_kit_spawn", false)) { if (!IsDefibOwned(entity)) { for (new i = 0; i <= GetArraySize(MedsArray) - 1; i++) { if (entity == GetArrayCell(MedsArray, i)) { return; } } PushArrayCell(MedsArray, entity); } } } } public Action:BotsDefib(Handle:timer) { if (!IsServerProcessing()) { return Plugin_Continue; } decl Float:Origin[3], Float:TOrigin[3]; new i = -1; while ((i = FindEntityByClassname(i, "survivor_death_model")) != INVALID_ENT_REFERENCE) { GetEntPropVector(i, Prop_Send, "m_vecOrigin", Origin); for (new j = 1; j <= MaxClients; j++) { if (IsSurvivor(j) && IsFakeClient(j) && IsPlayerAlive(j) && !IsIncapacitated(j) && !IsPlayerHeld(j) && !IsAssistNeeded() && ClientHasFewThreats(j)) { GetEntPropVector(j, Prop_Send, "m_vecOrigin", TOrigin); new Float:distance = GetVectorDistance(TOrigin, Origin); new String:defib[32]; if (IsValidEdict(GetPlayerWeaponSlot(j, 3))) { GetEdictClassname(GetPlayerWeaponSlot(j, 3), defib, sizeof(defib)); if (distance > 100 && distance < 800) { if (StrEqual(defib, "weapon_defibrillator")) { ScriptCommand(j, "script", "CommandABot({cmd=1,pos=Vector(%f,%f,%f),bot=GetPlayerFromUserID(%i)})", Origin[0], Origin[1], Origin[2], GetClientUserId(j)); break; } } else if (distance < 100) { if (StrEqual(defib, "weapon_defibrillator") && ChangePlayerWeaponSlot(j, 3)) { decl Float:EyePos[3], Float:AimOnDeadSurvivor[3], Float:AimAngles[3]; GetClientEyePosition(j, EyePos); MakeVectorFromPoints(EyePos, Origin, AimOnDeadSurvivor); GetVectorAngles(AimOnDeadSurvivor, AimAngles); TeleportEntity(j, NULL_VECTOR, AimAngles, NULL_VECTOR); CreateTimer(0.2, AllowDefib, GetClientUserId(j), TIMER_FLAG_NO_MAPCHANGE); break; } } } } } break; } return Plugin_Continue; } // Bot AI Manipulations Functions public Action:RegroupBots(client, args) { decl Float:Origin[3]; GetClientAbsOrigin(client, Origin); for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i) && IsPlayerAlive(i) && !IsIncapacitated(i) && !IsAssistNeeded() && ClientHasFewThreats(i)) { ScriptCommand(i, "script", "CommandABot({cmd=1,pos=Vector(%f,%f,%f),bot=GetPlayerFromUserID(%i)})", Origin[0], Origin[1], Origin[2], GetClientUserId(i)); } } } public Action:AttackSI(client, args) { if (!IsSurvivor(client)) return; new target = GetClientAimTarget(client); if (!IsInfected(target)) return; for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i) && IsPlayerAlive(i) && !IsIncapacitated(i) && !IsAssistNeeded()) { ScriptCommand(i, "script", "CommandABot({cmd=0,bot=GetPlayerFromUserID(%i),target=GetPlayerFromUserID(%i)})", GetClientUserId(i), GetClientUserId(target)); } } } public Action:RunAway(client, args) { if (!IsSurvivor(client)) return; new target = GetClientAimTarget(client); if (!IsInfected(target)) return; for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i) && IsPlayerAlive(i) && !IsIncapacitated(i) && !IsAssistNeeded()) { ScriptCommand(i, "script", "CommandABot({cmd=2,bot=GetPlayerFromUserID(%i),target=GetPlayerFromUserID(%i)})", GetClientUserId(i), GetClientUserId(target)); } } } // This only fires if we have Left4Downtown2! public Action:L4D2_OnFindScavengeItem(client, &item) { if (!item) { decl Float:Origin[3], Float:TOrigin[3]; if (MedsArray != INVALID_HANDLE) { new iWeapon = GetPlayerWeaponSlot(client, 3); if (iWeapon > MaxClients) { new String:weapon[32]; if (IsValidEdict(GetEdictClassname(GetPlayerWeaponSlot(client, 3), weapon, sizeof(weapon)))) { if (StrEqual(weapon, "weapon_defibrillator") || StrEqual(weapon, "weapon_first_aid_kit")) { return Plugin_Continue; } } } for (new i = 0; i <= GetArraySize(MedsArray) - 1; i++) { GetEntPropVector(GetArrayCell(MedsArray, i), Prop_Send, "m_vecOrigin", Origin); GetEntPropVector(client, Prop_Send, "m_vecOrigin", TOrigin); new Float:distance = GetVectorDistance(TOrigin, Origin); if (distance < 300) { item = GetArrayCell(MedsArray, i); return Plugin_Changed; } } } } return Plugin_Continue; } // Functions to allow the Bot to use Defibs public Action:AllowDefib(Handle:Timer, any:userid) { new client = GetClientOfUserId(userid); shoot[client] = STARTSHOOTING; } public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon) { if (IsSurvivor(client) && IsPlayerAlive(client) && IsFakeClient(client)) { new defib = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"); if (IsValidEntity(defib)) { decl String:classname[128]; GetEntityClassname(defib, classname, sizeof(classname)); if (defib == GetPlayerWeaponSlot(client, 3) && StrEqual(classname, "weapon_defibrillator")) { if (shoot[client] == STARTSHOOTING) { buttons |= IN_ATTACK; } else if (shoot[client] == STOPSHOOTING) { buttons &= ~IN_ATTACK; } } } } return Plugin_Continue; } // Event Hooks so we can reset bots and prevent them from being stuck in the trying to defib state public Action:Event_DefibUsed(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); if (IsSurvivor(client) && IsFakeClient(client)) { shoot[client] = STOPSHOOTING; CreateTimer(0.4, ResetBotAI, GetClientUserId(client)); } } public Action:Event_DefibFailed(Handle:event, const String:name[], bool:dontBroadcast) { new client = GetClientOfUserId(GetEventInt(event, "userid")); if (IsSurvivor(client) && IsFakeClient(client)) { shoot[client] = STOPSHOOTING; CreateTimer(6.0, ResetBotAI, GetClientUserId(client)); } } public Action:ResetSurvivorAI(client, args) { for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i) && IsPlayerAlive(i) && !IsIncapacitated(i) && !IsAssistNeeded() && ClientHasFewThreats(i)) { ScriptCommand(i, "script", "CommandABot({cmd=3,bot=GetPlayerFromUserID(%i)})", GetClientUserId(i)); } } } public Action:ResetBotAI(Handle:Timer, any:userid) { new client = GetClientOfUserId(userid); if (IsSurvivor(client) && IsFakeClient(client)) { shoot[client] = STOPSHOOTING; ScriptCommand(client, "script", "CommandABot({cmd=3,bot=GetPlayerFromUserID(%i)})", GetClientUserId(client)); } } // Stock functions, bools, etc stock bool:IsIncapacitated(client) { if (GetEntProp(client, Prop_Send, "m_isIncapacitated", 1) > 0) return true; return false; } stock bool:ChangePlayerWeaponSlot(Client, weaponslot) { new iWeapon = GetPlayerWeaponSlot(Client, weaponslot); if (iWeapon > MaxClients) { new String:weapon[32]; if (IsValidEdict(GetEdictClassname(GetPlayerWeaponSlot(Client, 3), weapon, sizeof(weapon)))) { if (StrEqual(weapon, "weapon_defibrillator")) { FakeClientCommand(Client, "use weapon_defibrillator"); return true; } } } return false; } stock bool:IsPlayerHeld(client) { new jockey = GetEntPropEnt(client, Prop_Send, "m_jockeyAttacker"); new charger = GetEntPropEnt(client, Prop_Send, "m_pummelAttacker"); new hunter = GetEntPropEnt(client, Prop_Send, "m_pounceAttacker"); new smoker = GetEntPropEnt(client, Prop_Send, "m_tongueOwner"); if (jockey > 0 || charger > 0 || hunter > 0 || smoker > 0) { return true; } return false; } stock bool:IsAssistNeeded() { for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i)) { if (IsIncapacitated(i) || IsPlayerHeld(i)) { return true; } } } return false; } stock bool:IsDefibOwned(defib) { for (new i = 1; i <= MaxClients; i++) { if (IsSurvivor(i)) { if (GetPlayerWeaponSlot(i, 3) == defib) { return true; } } } return false; } stock bool:ClientHasFewThreats(client) { if (IsSurvivor(client)) { new threats = GetEntProp(client, Prop_Send, "m_hasVisibleThreats"); if (threats <= 0) { return true; } } return false; } stock ScriptCommand(client, const String:command[], const String:arguments[], any:...) { new String:vscript[PLATFORM_MAX_PATH]; VFormat(vscript, sizeof(vscript), arguments, 4); new flags = GetCommandFlags(command); SetCommandFlags(command, flags^FCVAR_CHEAT); FakeClientCommand(client, "%s %s", command, vscript); SetCommandFlags(command, flags | FCVAR_CHEAT); } stock bool:IsSurvivor(client) { if (client > 0 && client <= MaxClients && IsClientInGame(client) && GetClientTeam(client) == 2) { return true; } return false; } stock bool:IsInfected(client) { if (client > 0 && client <= MaxClients && IsClientInGame(client) && GetClientTeam(client) == 3) { return true; } return false; } 2 Поделиться сообщением Ссылка на сообщение
30 мая, 2015 лайк за самое большое сообщение на форуме :lol3: Поделиться сообщением Ссылка на сообщение