Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Зоны (Идея с GalaxY)

Статус
В этой теме нельзя размещать новые ответы.

eFFect

Дебютант
Да простит меня Администрация GalaxY за то что "украл" у них идею :eek:pasno:

И так, это моё первое Готовое решение, да и вообще первая работа на этом форуме. Как и все новички, попрошу строго не судить, ибо уровень моего скриптинга в pawn колеблется от 1 до 2 (по 5 бальной шкале xd).

Описание:
Один из игроков создаёт "зону", (указав при этом её параметры), остальные входят в неё командой /jzona. Поочерёдно игроки будут ТП'шиться на две противоположные базы (у 1 базы цвет синий, у второй красный). Потом начинается тупой ДМ xD Последний оставшийся в зоне, победитель! Победитель спавнится и получает награду указанную при создании зоны.

P.S. Изначально делались CS зоны, поэтому и деление на две команды Красные vs Синие.

И так, начнём. Ко всем forward'ам добовляем:
PHP:
forward FreezeZona(playerid, countid);
forward TimerZona();
Далее, ко всем new'ам:
PHP:
new zona, maxplayers, players, winner, zgun;
new InZona[MAX_PLAYERS];
Потом в OnGameModeInit добавляем таймер:
PHP:
SetTimer("TimerZona", 1000, 1);
Теперь в OnPlayerDeath:
PHP:
if(InZona[playerid] == 601)
{
    players--;
    InZona[playerid] = 600;
    if(players == 1)
    {
        new string[256];
        format(string, 256, "* Зона завершена! Победитель: %s[%d]", PlayerName(killerid), killerid);
        SendClientMessageToAll(0xFFFFFF, string);
        GivePlayerMoney(killerid, winner);
        InZona[killerid] = 600;
        SpawnPlayer(killerid);
        zona = 0;
        players = 0;
        maxplayers = 0;
        winner = 0;
        zgun = 0;
    }
}
Далее идём в OnPlayerCommandText и вставляем туда команды управления зонами:
PHP:
new string[256];

if(strcmp(cmd, "/czona", true) == 0) // Создать зону
{
    tmp = strtok(cmdtext, idx);
    new tmpzona = strval(tmp);
    tmp = strtok(cmdtext, idx);
    new tmpgun = strval(tmp);
    tmp = strtok(cmdtext, idx);
    new tmpplayers = strval(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
        SendClientMessage(playerid, 0xAAFFAA, "* Используйте: /czona [ид зоны] [оружие] [макс. игроков] [вознагрождение]");
     	return 1;
    }
    new tmpwinner = strval(tmp);
    new tmpzonaname[128], tmpgunname[64];
    zona = tmpzona;
    maxplayers = tmpplayers;
    winner = tmpwinner;
    zgun = tmpgun;
    switch(zona)
    {
        case 1: tmpzonaname = "RC Battlefield";
    }
    switch(tmpgun)
    {
        /* По желанию,
        можете добавить
        сюда ID'ы других
        оружий, чтобы они
        отображались в
        сообщении */
        case 24: tmpgunname = "Eagle";
        case 30: tmpgunname = "Ak47";
        case 31: tmpgunname = "M4";
    }
    format(string, 256, "* Игрок %s создал зону %s на %s Макс. игроков: %d Победителю: $%d", PlayerName(playerid), tmpzonaname, tmpgunname, tmpplayers, tmpwinner);
    SendClientMessageToAll(0xFF0000, string);
    return 1;
}

if(strcmp(cmd, "/qzona", true) == 0) // Закрыть зону
{
    if(zona == 0) return SendClientMessage(playerid, 0xAAAAAA, "* Зона не создана");
    new tmpzonaname[128];
    switch(zona)
    {
        case 1: tmpzonaname = "RC Battlefield";
    }
    format(string, 256, "* Игрок %s закрыл зону %s", PlayerName(playerid), tmpzonaname);
    SendClientMessageToAll(0xFF0000, string);
    ResetPlayerWeapons(playerid);
    for(new i = 0; i <= MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
        	if(InZona[i] > 0)
		{
			SpawnPlayer(i);
			InZona[i] = 600;
		}
	}
    }
    zona = 0;
    players = 0;
    maxplayers = 0;
    winner = 0;
    zgun = 0;
    return 1;
}

if(strcmp(cmd, "/jzona", true) == 0) // Войти в зону
{
    if(zona < 1) return SendClientMessage(playerid, 0xAAAAAA, "* Зона ещё не создана");
    if(players == maxplayers) return SendClientMessage(playerid, 0xAAAAAA, "* Зона заполнена");
    if(InZona[playerid] == 601) return SendClientMessage(playerid, 0xAAAAAA, "* Вы уже в зоне");
    if(InZona[playerid] > 0)
    {
        format(string, 256, "* Вы уже участвовали в зоне. Подождите %d секунд", InZona[playerid]);
	SendClientMessage(playerid, 0xAAAAAA, string);
	return 1;
    }
    players++;
    InZona[playerid] = 601;
    if(zona == 1)
    {
        if(players % 2 == 0)
	{
	    SetPlayerInterior(playerid, 10);
	    SetPlayerPos(playerid, -975.975708, 1060.983032, 1345.671875);
	    SetPlayerColor(playerid, 0xFF0000AA);
	}
	else
	{
	    SetPlayerInterior(playerid, 10);
	    SetPlayerPos(playerid, -1131.4973, 1057.7863, 1346.4158);
	    SetPlayerColor(playerid, 0xFF0000AA);
	}
    }
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid, zgun, 228);
    new count = 4;
    for(new i = 0; i < 5; i++)
    {
       	SetTimerEx("FreezeZona", i*1200, 0, "dd", playerid, count);
       	count--;
    }
    SendClientMessage(playerid, 0x00FF00, "* Вы вошли в зону");
    return 1;
}
Tеперь в самый конец мода вставляем паблик TimerZona и FreezeZona:
PHP:
public TimerZona()
{
    for(new i = 0; i <= MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            if(InZona[i] > 0 && InZona[i] != 601) InZona[i]--;
        }
    }
    return 1;
}

public FreezeZona(playerid, countid)
{
    new str[64];
    if(countid == 4)
    {
        TogglePlayerControllable(playerid, 0);
        format(str, 64, "Please Wait... ~n~ ~b~%s", PlayerName(playerid));
        GameTextForPlayer(playerid, str, 1000, 6);
    }
    else if(countid)
    {
        format(str, 64, "%d", countid);
        GameTextForPlayer(playerid, str, 1000, 6);
    }
    else
    {
        TogglePlayerControllable(playerid, 1);
        GameTextForPlayer(playerid, "~r~Go!", 1500, 6);
    }
    return 1;
}
Если нету, так же в конце вставляем функцию PlayerName:

PHP:
stock PlayerName(playerid)
{
	new pname[MAX_PLAYER_NAME];
	GetPlayerName(playerid, pname, sizeof(pname));
	return pname;
}
Вот как бы и всё :)

В этом варианте всего 1 интерьер и зону может создать любой игрок, если вы хотите чтобы создавать/удалять зоны могла только Администрация сервера, просто добавьте в команду /czona и /qzona проверку на Администратора.

Пробуем!

Если найдете баги/ошибки, пишите их в эту тему, исправим :)

От себя

Просьба не "тыкать" меня носом в мой код, я только начинающий скриптер в pawn и незнаю всех нюансов оптимизации.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу