Активный
- Тема Автор
- #1
Идея и назначение
Игрок может арендовать небольшую зону, где действуют особые правила.
В зоне можно ограничить вход или использовать ее как личное место.
Суть реализации
1. Храним центр и радиус приватной зоны для игрока.
2. Проверяем, входит ли другой игрок в чужую зону.
3. При входе можно кикать из зоны или отправлять сообщение.
Реализация
Дополнительные идеи
1. Телепортировать чужих игроков из приватной зоны.
2. Брать аренду за создание зоны.
3. Делать разные типы зон с разными правами.
Игрок может арендовать небольшую зону, где действуют особые правила.
В зоне можно ограничить вход или использовать ее как личное место.
Суть реализации
1. Храним центр и радиус приватной зоны для игрока.
2. Проверяем, входит ли другой игрок в чужую зону.
3. При входе можно кикать из зоны или отправлять сообщение.
Реализация
Код:
new Float:ZoneX[MAX_PLAYERS], Float:ZoneY[MAX_PLAYERS], Float:ZoneZ[MAX_PLAYERS];
new Float:ZoneR[MAX_PLAYERS];
new bool:HasZone[MAX_PLAYERS];
CMD:setzone(playerid, params[])
{
new radius;
if(sscanf(params, "i", radius))
return SendClientMessage(playerid, -1, "Используй: /setzone [радиус].");
if(radius <= 0)
return SendClientMessage(playerid, -1, "Радиус должен быть больше нуля.");
GetPlayerPos(playerid, ZoneX[playerid], ZoneY[playerid], ZoneZ[playerid]);
ZoneR[playerid] = float(radius);
HasZone[playerid] = true;
SendClientMessage(playerid, -1, "Приватная зона установлена.");
return 1;
}
public OnPlayerUpdate(playerid)
{
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!HasZone[i]) continue;
if(i == playerid) continue;
new Float:dx = x - ZoneX[i];
new Float:dy = y - ZoneY[i];
new Float:dist = floatsqroot(dx * dx + dy * dy);
if(dist < ZoneR[i])
{
SendClientMessage(playerid, -1, "Ты вошел в приватную зону другого игрока.");
break;
}
}
return 1;
}
Дополнительные идеи
1. Телепортировать чужих игроков из приватной зоны.
2. Брать аренду за создание зоны.
3. Делать разные типы зон с разными правами.