Как сделать в одном сервере несколько?
#1

У меня такая идея.
Сделать в одном сервере несколько.
Тоесть.
аходишь на сервер появляется диалог. окно а там выбираешь из 2-ух кнопок Присоединится или Создать.
Нажимаем создать. Пишим название сервера и пароль если надо.
Как сделать на словах поясните, можно и код для полной картины)
Reply
#2

Первое, тут не дают готовых кодов, сам должен сделать.
Второе, ты сам та себе это как представляешь?
Reply
#3

Пока слабо представляю.
Мб в каждом паблике типа
public OnPlayerSpawn(playerid)
{
for(new i=0;i<MAX_SERVER;i++)
{
if(Server[i] == PlayerGetServer[playerid])
{
Reply
#4

что?! ЧТО?! ЧТО?!

взрыв мозга.
Reply
#5

Я хз. Но я знаю как-то можно.
Reply
#6

Сразу могу сказать, что тупо сделать 2 gamemode'а (TDM и stunt к примеру) и запустить оба на одном процессе не получится. Тебе нужно будет сделать сервер и функции так, что-бы они различали на каком "виртуальном сервере" игрок находиться. Кто-то создал сервер stunt, ещё кто-то TDM, но комманда /drift1 должна работать только на stunt серваке:
pawn Код:
#define MAX_SERVERS 5

#define SERVER_TYPE_UNSET 0
#define SERVER_TYPE_STUNT 1
#define SERVER_TYPE_TDM 2

enum __SINFO__
{
   ...
   sType, //определяет тип сервера (SERVER_TYPE_...)
   ...
}
new sInfo[MAX_SERVERS][__SINFO__];

enum __PINFO__
{
   ...
   pServer, //содержит ИД виртуального сервера (sInfo[x])
   ...
}
new pInfo[MAX_PLAYERS][__PINFO__];

CMD:drift1(p, par[])
{
   if(sInfo[pInfo[p][pServer]][sType] != SERVER_TYPE_STUNT) return 0;
   SetPlayerPos(...);
   return 1;
}
Reply
#7

Вполне возможно, виртуальные миры в помощь. Но точно не уверен в абсолютной изоляции виртуальных миров. Также юзаем фильтрскрипты для каждого из режимов. Но придется или заново писать режимы или подработать существующие под эту систему. Также придется юзать какое-то хранилище для общих данных (можно заюзать set/getproperty).

Присоединиться/создать.. ну это тоже возможно, только все равно болванки нужны для создания игры.

Мало кто из текущих скриптеров на это способен, потому что много логики нужно, а также блестящее знание языка. Но как идея это выглядит куда лучше.
Reply
#8

Незнаю, может это и реально реализовать, но это действительно, взрыв мозга.

Зато пришла такая идея: Сделать конструктор серверов. Как это работает:
Заходим на сервер и через диалоги указываем параметры нового сервера, выбираем мод, FS, порт......
Далее его запускаем, и подключаемся на тот-же IP, но на указанный порт при создании сервера.

Это реализовать куда проще, но потребуется мощный плагин по работе с файлами, включая распаковку\запаковку архивов, выполнение shell и прочее...
Reply
#9

Я хз. На ошибки не смотрите я знаю их тут много и знаю где. Просто надо разобраться как сделать)
Код:
#include <a_samp>

#define MAX_SERVER 30
#define MAX_PLAYERS_SERVER 12
#define DM 0
#define STUNT 1
#define DRIFT 2
#define CLANWAR 3
enum sinfo
{
	sName[32],
	MPlayers,
	OPlayers
};
new Server[MAX_SERVER][sinfo];
new PlayerServer[MAX_PLAYERS];
main(){}
public OnGameModeInit()
{
	new str[32];
	SetGameModeText("TEST");
	for(new i=0;i<MAX_SERVER;i++)
	{
		format(str,32,"Тестовый сервер!№%d",i);
		Server[i][sName] = str;
		Server[i][MPlayers] = 16;
	}
	return 1;
}
public OnGameModeExit()
{
	return 1;
}
stock GetOnlineServer()
{
	new a;
    for(new i=0;i<MAX_SERVER;i++)
	{
        if(strlen(Server[i][sName])>0)continue;
        a++;
    }
    return a;
}
public OnPlayerRequestClass(playerid, classid)
{
	SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
	SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
	return 1;
}
public OnPlayerConnect(playerid)
{
	new string[256],string2[512];
	for(new i=0;i<MAX_SERVER;i++)
	{
		format(string, sizeof(string), "[%d] %s [%d/%d]\n",i,Server[i][sName],Server[i][OPlayers],Server[i][MPlayers]);
  		strins(string2, string, strlen(string2), strlen(string));
 	}
	ShowPlayerDialog(playerid,0,DIALOG_STYLE_LIST,"Сервера", string2,"Присоединится","Создать");
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	return 1;
}
public OnPlayerSpawn(playerid)
{
	return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
	return 1;
}
public OnVehicleSpawn(vehicleid)
{
	return 1;
}
public OnVehicleDeath(vehicleid, killerid)
{
	return 1;
}
public OnPlayerText(playerid, text[])
{
	return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
	return 0;
}
public OnPlayerUpdate(playerid)
{
	return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == 0)
	{
	    if(response)
	    {
	    	PlayerServer[playerid] = listitem;
	    	Server[listitem][OPlayers]++;
	    	new string[256];
			format(string, sizeof(string), "Вы присоединились к серверу %s [%d/%d]",Server[listitem][sName],Server[listitem][OPlayers],Server[listitem][MPlayers]);
        	SendClientMessage(playerid,0x30B0F6AA, string);
	    }
	    else
	    {
	    
	    }
	}
	return 1;
}
Reply
#10

Если будете делать все это в одном скрипте, Вам понадобится двойная порция логики.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)