Вход

Просмотр полной версии : [Вопрос] Как запретить игрокам посещение территории



Max_Tolk
04.11.2016, 12:21
Всем привет. Хочу закрыть от посещения несколько городов, но не знаю как это сделать. Хотелось бы что бы когда игрок зашел на территорию где ему не желательно находиться, он умирал. Ну например: Игрок зашел в СФ, а там нельзя ему быть и он автоматически умерает

VVWVV
04.11.2016, 12:33
Можно, конечно, воспользоваться функцией SetPlayerWorldBounds, которая уже есть в SA:MP. Однако, для неё нет никого паблика или функции, которые бы позволили определить состояние игрока. Хотя вы можете сверять данные, но это не рационально.
Альтернативой может послужить плагин streamer с его динамическими зонами. Ко всему прочему, он добавляет callback-функции, определяющие состояние игрока в этих зонах.

Max_Tolk
04.11.2016, 12:38
Ну мне не обязательно что бы они умирали, достаточно что бы они просто не могли войти

VVWVV
04.11.2016, 12:40
Ну мне не обязательно что бы они умирали, достаточно что бы они просто не могли войти

В официальной вики по SA:MP написано: "игрок не сможет выйти за пределы, его будет отталкивать".



Players can not go out of the boundaries (they will be pushed back in).

DeimoS
04.11.2016, 12:43
В любом собейте это ограничение легко отключается, если что. Хотя это довольно бессмысленно для читера. Прото чтоб вы не пытались какие-нибудь тюрьмы делать на основе этой функции

Max_Tolk
04.11.2016, 12:59
Я как раз там ничего не хочу делать, просто все основные постройки будут в ЛС и не хотелось бы что бы игроки бегали по "пустым городам" да и смотреться будет глупо

- - - Добавлено - - -

Ну как я понял мне надо установить координаты в которых игрок будет находиться, а если за них зайдет его будет отталкивать

VVWVV
04.11.2016, 13:00
Я как раз там ничего не хочу делать, просто все основные постройки будут в ЛС и не хотелось бы что бы игроки бегали по "пустым городам" да и смотреться будет глупо

- - - Добавлено - - -

Ну как я понял мне надо установить координаты в которых игрок будет находиться, а если за них зайдет его будет отталкивать

Да. Либо же воспользоваться плагином streamer.

Max_Tolk
04.11.2016, 13:30
А стримером как?

- - - Добавлено - - -


forward IsPlayerInArea();
public isPlayerInArea()
{
new Float:X, Float:Y, Float:Z;
for(new i=0; i < MAX_PLAYERS; i++)
{
GetPlayerPos(i, X, Y, Z);
if(X >= 2150.241 && X <= 2500.678 && Y <= 401.121 && Y >= 37.669)
{
SetPlayerHealth(i, 0);
}
}
}
Так?

- - - Добавлено - - -

Только у меня ошибку выдает я не знаю почему
(411) : warning 235: public function lacks forward declaration (symbol "isPlayerInArea")

VVWVV
04.11.2016, 13:39
А стримером как?

- - - Добавлено - - -


forward IsPlayerInArea();
public isPlayerInArea()
{
new Float:X, Float:Y, Float:Z;
for(new i=0; i < MAX_PLAYERS; i++)
{
GetPlayerPos(i, X, Y, Z);
if(X >= 2150.241 && X <= 2500.678 && Y <= 401.121 && Y >= 37.669)
{
SetPlayerHealth(i, 0);
}
}
}
Так?

- - - Добавлено - - -

Только у меня ошибку выдает я не знаю почему
(411) : warning 235: public function lacks forward declaration (symbol "isPlayerInArea")

Нет. Как я уже сказал выше, что streamer добавляет собственные callback-функции. С помощью них вы сможете определить состояние игрока относительно вашей зоны.
Т.е. вам придётся создать какую-то область, и в ней определять положение игрока, используя функции OnPlayerEnterDynamicArea / OnPlayerLeaveDynamicArea. Хотя в вашем случае понадобится лишь OnPlayerLeaveDynamicArea.

Области имеются разных типов:


native STREAMER_TAG_AREA CreateDynamicCircle(Float:x, Float:y, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicCylinder(Float:x, Float:y, Float:minz, Float:maxz, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicSphere(Float:x, Float:y, Float:z, Float:size, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicRectangle(Float:minx, Float:miny, Float:maxx, Float:maxy, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicCuboid(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicCube(Float:minx, Float:miny, Float:minz, Float:maxx, Float:maxy, Float:maxz, worldid = -1, interiorid = -1, playerid = -1);
native STREAMER_TAG_AREA CreateDynamicPolygon(Float:points[], Float:minz = -FLOAT_INFINITY, Float:maxz = FLOAT_INFINITY, maxpoints = sizeof points, worldid = -1, interiorid = -1, playerid = -1);

KrutoyKrosch
04.11.2016, 13:46
Можно еще через SAMP_Zone_Editor, так удобней

Max_Tolk
04.11.2016, 14:05
- - - Добавлено - - -

Да я разобрался со стримером, а как сделать что бы эта зона выделялась цветом на карте?

VVWVV
04.11.2016, 14:07
- - - Добавлено - - -

Да я разобрался со стримером, а как сделать что бы эта зона выделялась цветом на карте?

Функция GangZoneCreate

DeimoS
04.11.2016, 19:15
Я как раз там ничего не хочу делать, просто все основные постройки будут в ЛС и не хотелось бы что бы игроки бегали по "пустым городам" да и смотреться будет глупо

- - - Добавлено - - -

Ну как я понял мне надо установить координаты в которых игрок будет находиться, а если за них зайдет его будет отталкивать

Тогда уж проще использовать SetPlayerWorldBounds

wAx
04.11.2016, 20:29
Я как раз там ничего не хочу делать, просто все основные постройки будут в ЛС и не хотелось бы что бы игроки бегали по "пустым городам" да и смотреться будет глупо

- - - Добавлено - - -

Ну как я понял мне надо установить координаты в которых игрок будет находиться, а если за них зайдет его будет отталкивать

Как вариант, предлагаю на выездах из ЛС заблокировать дороги с помощью объектов (как в старом добром Вайсе), это будет намного логичнее если ты не хочешь чтобы игроки просто катались по другим городам, которые ты не собираешься использовать. Таким образом, большая масса игроков, просто увидит что дороги заблокированы и не поедет, ну а ребят, которым интересно будет посмотреть что да как, ожидают всего лишь, пустые города.

Max_Tolk
04.11.2016, 20:38
Ну это тоже можно использовать как вариант, но я сделал полосы которые убивают игроков когда те пытаются через нее проехать/пролететь.


new zone1;

public OnGameModeInit()
{
zone1 = CreateDynamicRectangle(-1039.8181,594.2924,2834.1855,684.0699, 0, 0, -1);
return 1;
}

public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Ваше присутствие в этой зоне не желательно."); // Текст который выскочит перед смерть
for(new i=0; i < MAX_PLAYERS; i++)
SetPlayerHealth(i, 0); // после заезда за линию мы оставляем игроку 0 хп тем самым убиваем его
return 1;
}

public OnPlayerLeaveDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Больше не пытайтесь проникнуть туда."); // текст после смерти
return 1;
}

- - - Добавлено - - -

Это въезд в лв со стороны лс

wAx
04.11.2016, 20:39
Ну это тоже можно использовать как вариант, но я сделал полосы которые убивают игроков когда те пытаются через нее проехать/пролететь.


new zone1;

public OnGameModeInit()
{
zone1 = CreateDynamicRectangle(-1039.8181,594.2924,2834.1855,684.0699, 0, 0, -1);
return 1;
}

public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Ваше присутствие в этой зоне не желательно."); // Текст который выскочит перед смерть
for(new i=0; i < MAX_PLAYERS; i++)
SetPlayerHealth(i, 0); // после заезда за линию мы оставляем игроку 0 хп тем самым убиваем его
return 1;
}

public OnPlayerLeaveDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Больше не пытайтесь проникнуть туда."); // текст после смерти
return 1;
}

- - - Добавлено - - -

Это въезд в лв со стороны лс

до жути негуманный сервер :rofl:

да и к тому-же циклом, ты будешь убивать всех игроков а не только одного

for(new i=0; i < MAX_PLAYERS; i++)
SetPlayerHealth(i, 0);

=>


if(areaid == zone1)
{
SendClientMessage(playerid,-1,"Ваше присутствие в этой зоне не желательно.");
SetPlayerHealth(playerid, 0.0);
}

давай от греха, заберем все выполняемые действия в тело условия

Blood
04.11.2016, 21:01
Как вариант, предлагаю на выездах из ЛС заблокировать дороги с помощью объектов (как в старом добром Вайсе), это будет намного логичнее если ты не хочешь чтобы игроки просто катались по другим городам, которые ты не собираешься использовать. Таким образом, большая масса игроков, просто увидит что дороги заблокированы и не поедет, ну а ребят, которым интересно будет посмотреть что да как, ожидают всего лишь, пустые города.

Самый правильный вариант .

Max_Tolk
04.11.2016, 21:17
спасибо исправил

- - - Добавлено - - -

я тоже так думаю, но под задумку не подойдет :sad:

DeimoS
04.11.2016, 21:49
Ну это тоже можно использовать как вариант, но я сделал полосы которые убивают игроков когда те пытаются через нее проехать/пролететь.


new zone1;

public OnGameModeInit()
{
zone1 = CreateDynamicRectangle(-1039.8181,594.2924,2834.1855,684.0699, 0, 0, -1);
return 1;
}

public OnPlayerEnterDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Ваше присутствие в этой зоне не желательно."); // Текст который выскочит перед смерть
for(new i=0; i < MAX_PLAYERS; i++)
SetPlayerHealth(i, 0); // после заезда за линию мы оставляем игроку 0 хп тем самым убиваем его
return 1;
}

public OnPlayerLeaveDynamicArea(playerid, areaid)
{
if(areaid == zone1) SendClientMessage(playerid,-1,"Больше не пытайтесь проникнуть туда."); // текст после смерти
return 1;
}

- - - Добавлено - - -

Это въезд в лв со стороны лс

К чему такие сложности? Создай квадратную зону, которая покроет весь LS, и если игрок вышел из этой зоны - начни постепенно отнимать здоровье.

Если же квадрат не покроет нужную территорию - делай из CreateDynamicPolygon. И выйдет всего 1 динамическая зона вместо кучи.

Хотя я всё ещё не понимаю зачем нагружать сервер подобными проверками, когда нужно просто ограничить игроков от пустых городов. С помощью SetPlayerWorldBounds всю работу можно перенести на сторону игроков, ибо эта функция просто меняет внутреигровые настройки у конкретного игрока.

Nexius_Tailer
04.11.2016, 22:40
В любом собейте это ограничение легко отключается, если что. Хотя это довольно бессмысленно для читера. Прото чтоб вы не пытались какие-нибудь тюрьмы делать на основе этой функции
Как и отключается выдача сервером здоровья, позиции, и всех остальных функций, для справки

Согласен с wAx, проще и реалистичнее будет просто наставить объектов как в сингле (ремонт дороги к примеру), как знак того, что дальше ничего интересного нет

KrutoyKrosch
05.11.2016, 01:23
Скинул уже даже редактор для зон, вы все обсуждаете кого то

TheMallard
05.11.2016, 16:34
Объекты и WorldBounds - идеально.

Объекты не дадут выехать на автомобиле. Даже если игрок переплывет реку или залив, то он не станет дальше бежать пешком. Если игрок полетит на вертолете и самолете, то он упрется в WorldBounds.

Даже если читер отрубит worldbounds, смысла перется туда нет.