Это уже перебор. :DAlmazON, чувак, общение с тобой - бесценный опыт, спасибо.
Нет, здесь лучше всего подходит const String:, а не static.static String:de_dust2[]
Не увидел использования, а потому - лучше убрать. Оффтоп#define PLUGIN_NAME "MapLimit"
Здесь тип хука вовсе не обязательно писать - он идёт по умолчанию.OnPlayerFootStep, EventHookMode_Post
Боты всё равно подсчитываются функцией, а потому проверка на бота - бесполезный груз.public void OnClientPostAdminCheck(int client){
if(IsCorrectMap && !IsFakeClient(client)){
CountPlayers = GetClientCount();
}
}
Action: в событиях работает только для метод-хука EventHookMode_Pre. Содержимое события вполне нормально. ОффтопAction:OnPlayerFootStep
Далее тоже заменить на переменную, раз уж её ввели. Я писал пример ещё по старой схеме подсчёта количества игроков.GetClientCount()
На csgo работать будет?
Для неё и сделано, даже на скриншоте видно.de_dust2 CS:GO version
Пробовал, но это увеличивает площадь огня и игроки начинают гореть даже на длине(IgniteEntity(client, 3.8); м.б. увеличить?
Есть такая проблема. Костыльно это можно решить способом, который указан ниже. Там не урон увеличивается, но время горения. К этому сообщению я файл приложил, в нем закрыты верхняя темка и Б плент (находясь там люди будут гореть).Есть проблема, террористы умудряются добежать до Б через мидл, вопрос в следующем как увеличить урон от огня?
Это время горения IgniteEntity · sdktools_functions · SourceMod Scripting API ReferenceПробовал, но это увеличивает площадь огня и игроки начинают гореть даже на длине(
Пока только на карте de_dust2, но в планах добавить и другие популярные карты.Данное ограничение прохода на Б плент, действует только на карте de_dust2, или другие карты тоже?
static String:de_dust2[] = {
"MidDoors",
"UpperTunnel",
"LowerTunnel",
"Middle",
"OutsideTunnel",
"BDoors"
};
public Action:OnPlayerFootStep(Handle:event, const String:name[], bool:dontBroadcast){
new client = GetClientOfUserId(GetEventInt(event, "userid"));
static String:location[16];
GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
if( GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE ){
for (new i = 0; i < sizeof(de_dust2); i++){
if (StrEqual(location, de_dust2[i])){
PrintToChat(client, "Не ходи на Б!!!");
if(IsPlayerAlive(client)) IgniteEntity(client, 3.8);
break;
}
}
}
}
Попробовал, есть один конкретный баг, когда останавливаешься, горение прекращается. Этак вышел на мидл с авп, стал и пуляй по респе ТТ (как пример).Вообще, может вместо SDKHooks использовать событие player_footstep? Конечно, плохо, что индекс игрока ещё нужно получать, но вызывается куда реже и не требует проверки на "жив/не жив" + не грузит сервер от наблюдателей. ОффтопХукать/унхукать тоже удобней при определённом количестве игроков.
@nikita1811 , постарался устранить эти замечания, но к сожалению не тестил и смогу это сделать не раньше сегодняшней ночи (работа), потому прилагаю правленный исходник в этом посте, а не в первом.@filipok, Все работает отлично, но нужно отключать плагин на картах не прописанных в maplimit.ini, так как инферно у меня не прописано в конфиге но на карте я сгораю в миде), пока решил проблему загрузкой плагина на нужные мне карты.
... убрать дикий спам игроку в чат "Не ходи на Б!!! точка где игрок находится", пусть пишет 1 или 2 раза.
Мне кажется это невозможно, насколько успел разобраться, конфиг читается при старте сервера, могу ошибатьсяP.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.P.S.S Также добавить более быструю скорость сгорания в огне, есть "индивиды" которые напролом бегут с бомбой на запрещенный плент и успевают поставить бомбу(
Не работает, логи:@nikita1811 , постарался устранить эти замечания, но к сожалению не тестил и смогу это сделать не раньше сегодняшней ночи (работа), потому прилагаю правленный исходник в этом посте, а не в первом.
L 02/29/2016 - 13:45:07: [SM] Plugin encountered error 15: Array index is out of bounds
L 02/29/2016 - 13:45:07: [SM] Displaying call stack trace for plugin "MapLimit.smx":
L 02/29/2016 - 13:45:07: [SM] [0] Line 42, C:\Users\Admin\Desktop\CSGO\scripting\MapLimit.sp::OnConfigsExecuted()
Думаю тоже выход :)В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.
"MapZones"
{
"de_dust2"
{
"Zone_0" "OutsideTunnel"
"Zone_1" "UpperTunnel"
"Zone_2" "LowerTunnel"
"Zone_3" "Middle"
"Zone_4" "MidDoors"
"Zone_5" "BDoors"
"Zone_6" "BombsiteB"
}
"de_mirage"
{
//"Zone_0" "SideAlley"
//"Zone_1" "Middle"
"Zone_2" "Tunnel"
"Zone_3" "TunnelStairs"
"Zone_4" "BackAlley"
"Zone_5" "House"
"Zone_6" "Apartments"
"Zone_7" "Balcony"
"Zone_8" "Truck"
"Zone_9" "BombsiteB"
"Zone_10" "Catwalk"
"Zone_11" "Shop"
}
"de_inferno"
{
"Zone_0" "Banana"
"Zone_1" "Truck"
"Zone_2" "Garden"
"Zone_3" "BombsiteB"
}
"de_nuke"
{
"Zone_0" "Radio"
"Zone_1" "SideRoom"
"Zone_2" "Ramp"
"Zone_3" "BombsiteB"
"Zone_4" "SideRoom"
"Zone_5" "Ducts"
"Zone_6" "Tunnel"
"Zone_7" "TunnelStairs"
}
"de_cache"
{
"Zone_0" "Back"
"Zone_1" "LongHall"
"Zone_2" "Window"
"Zone_3" "BombsiteB"
"Zone_4" "StorageRoom"
"Zone_5" "Ducts"
"Zone_6" "Entrance"
"Zone_7" "Rafters"
}
"de_train"
{
"Zone_0" "BackofB"
"Zone_1" "Scaffolding"
"Zone_2" "BombsiteB"
//"Zone_3" "BPlatform"
}
"de_cbble"
{
//"Zone_0" "TSideUpper"
//"Zone_1" "Tunnels"
//"Zone_2" "UpperTunnel"
"Zone_3" "BombsiteB"
//"Zone_4" "LowerTunnel"
"Zone_5" "SideDoor"
"Zone_6" "TMain"
"Zone_7" "BPlatform"
//"Zone_8" "Connector"
//"Zone_9" "Hut"
//"Zone_10" "Balcony"
}
}
Делай загрузку в OnMapStart()Мне кажется это невозможно, насколько успел разобраться, конфиг читается при старте сервера, могу ошибаться
Можно использовать env_fire,насколько я знаю та можно менять дамаг.В самой функции, которая воспламеняет игрока есть только параметр времени. Как на счет варианта, который бы закапывал игрока при нахождении в запретной зоне n секунд? Ну а там уже он просто догорал. Думаю это можно реализовать.
#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#define PLUGIN_MAINNAME "MapLimit"
#define PLUGIN_NAME "MapLimit"
#define PLUGIN_AUTHOR "filip fixed by AlmazON"
#define PLUGIN_VERSION "1.0.0"
#define MAX_PLAYERS_WHITHOUT_MIDDLE 10
bool OneTimeNotify;
bool IsCorrectMap;
int CountPlayers;
char MZones[12][PLATFORM_MAX_PATH];
bool SpawnProtect;
bool AlreadyNotified[MAXPLAYERS+1];
Handle kvMapLimit;
public OnMapStart()
{
kvMapLimit = CreateKeyValues("MapZones");
if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
}
}
public void OnPluginStart(){
/*kvMapLimit = CreateKeyValues("MapZones");
if(!FileToKeyValues(kvMapLimit, "addons/sourcemod/configs/maplimit.ini")){
SetFailState("Failed to load addons/sourcemod/configs/maplimit.ini");
}*/
HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
HookEvent("round_end", Event_RoundEnd);
RegAdminCmd("sm_place", WhereAmI, ADMFLAG_BAN);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////
public Action WhereAmI(int client, int args){
char location[32];
GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
ReplyToCommand(client, "%N is in %s", client, location);
LogMessage("client %N is in %s", client, location);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
public void OnConfigsExecuted(){
for (int i = 0; i < sizeof(MZones); i++){
MZones[i][0] = 0;
}
char MapName[16];
GetCurrentMap(MapName, sizeof(MapName));
KvRewind(kvMapLimit);
if(KvJumpToKey(kvMapLimit, MapName, false)){
KvGetString(kvMapLimit, "Zone_0", MZones[0], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_1", MZones[1], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_2", MZones[2], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_3", MZones[3], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_4", MZones[4], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_5", MZones[5], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_6", MZones[6], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_7", MZones[7], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_8", MZones[8], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_9", MZones[9], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_10", MZones[10], PLATFORM_MAX_PATH);
KvGetString(kvMapLimit, "Zone_11", MZones[11], PLATFORM_MAX_PATH);
IsCorrectMap = true;
}
}
public void OnClientPostAdminCheck(int client){
if(IsCorrectMap && !IsFakeClient(client)){
SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
CountPlayers = GetClientCount();
}
}
public void OnPostThinkPost(int client){
if(IsPlayerAlive(client)){
static char location[16];
static int i;
GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
// LogMessage("m_szLastPlaceName: %s", location);
if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE ){
for (i = 0; i < sizeof(MZones); ++i){
// LogMessage("StrEqual: %s-%s -> %b", location, MZones[i], StrEqual(location, MZones[i]));
if ((StrEqual(location, MZones[i])) && !SpawnProtect){
Notification(client);
IgniteEntity(client, 0.5);
return;
}else{
AlreadyNotified[client] = false;
}
}
}
}
}
public Action Notification(int client){
if (!AlreadyNotified[client]){
PrintHintText(client, "%N, эта запрещенная зона");
//PrintToChat(client, "%N, зона %s под запретом", location);
AlreadyNotified[client] = true;
}
}
public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast){
SpawnProtect = true;
}
public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
SpawnProtect = false;
if ( IsCorrectMap ) {
if (GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE){
PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков", MAX_PLAYERS_WHITHOUT_MIDDLE);
OneTimeNotify = true;
}
else if (OneTimeNotify){
PrintHintTextToAll("Играет полная карта");
OneTimeNotify = false;
}
}
}
Сделано, плагин перезалил в первом посте. Спасибо за разметку карт, ее тоже добавил в первый пост.@filipok, Все работает отлично, но нужно отключать плагин на картах не прописанных в maplimit.ini, так как инферно у меня не прописано в конфиге но на карте я сгораю в миде), пока решил проблему загрузкой плагина на нужные мне карты.
P.S Желательно чтобы настройки maplimit.ini применялись простой сменой карты (сейчас нужно останавливать сервер).
Это реализую попозже (неделя м.б.), времени к сожалению очень мало.P.S.S Также добавить более быструю скорость сгорания в огне, есть "индивиды" которые напролом бегут с бомбой на запрещенный плент и успевают поставить бомбу(
И последнее можно убрать дикий спам игроку в чат "Не ходи на Б!!! точка где игрок находится", пусть пишет 1 или 2 раза.
Лучше decl, либо новый синтаксис.C-подобный:new Float:vec[3];
kvMapLimit = CreateKeyValues("MapZones");
static int i;
for(
void OnConfigsExecuted()
KvGetString(kvMapLimit, "Zone_0", MZones[0], PLATFORM_MAX_PATH);
void OnClientPostAdminCheck(int client)
if (IsClientInGame(i)){
AlreadyNotifyed[i] = false;
CreateTimer((BURY_TIME - 1.0), ResetNotification, client);
CreateTimer(BURY_TIME, Timer_Callout, client);