Диалоговые окна
#1

Всем привет)
Раньше у меня стояла сис-ма покупки авто все работало замечательно,но потом мы поставили админку(в ней рега в диалогах) знакомые говорят что диалоги перепутались,помогите(научите) настраивать ID диалогов так чтобы и сис-ма покупки авто работала и админка пожалуйста
Reply
#2

Смотри:
Показываем диалог:
PHP код:
ShowPlayerDialog(ID_игрока,ID_диалога,Стиль_диалога,"Заголовок диалога","Текст в диалоге","Кнопка 1","Кнопка 2"); 
Но как тока игрок нажмёт любую кнопку в диалоге (Кнопка 1 == Enter, Кнопка 2 == Esc) вызовется:
PHP код:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[]) 
Где:
playerid == ID Игрока;
dialogid == ID Диалога, указанного при создании;
response == true, если нажали первую кнопку, и false, если вторую;
listitem == ID выбранного пункта в диалоге (Есть используем стиль DIALOG_STYLE_LIST)
inputtext[] == Строка, введённая в диалог (Есть используем стиль DIALOG_STYLE_INPUT, или полная строка из пункта DIALOG_STYLE_LIST)

Теперь на примере: Когда игрок сядет в тачку, у него вылезет окно с 2 кнопками, если нажать первую, он в ней останеться, если вторую, то выкинет:

PHP код:
public OnPlayerStateChange(playeridnewstateoldstate)
{
    if(
newstate == PLAYER_STATE_DRIVER// Игрок сел в тачку
    
{
        
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Пример диалога","Вы сели в машину, хотите остаться в ней?","Да","Нет");
    }
    
    return 
1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == 1// Обрабатываем диалог с ID == 1
    
{
        if(
response// Игрок нажал первую кнопку response == true
        
{
            
SendClientMessage(playerid,clLightRed,"Вы пожелали остаться в машине");
        }
        else 
// Игрок нажал вторую кнопку response == false
        
{
            
SendClientMessage(playerid,clLightRed,"Вы пожелали выйти из машины");
            
RemovePlayerFromVehicle(playerid)
        }
    }
    
    return 
1;

Reply
#3

Можно создать функцию (желательно в фильтрскрипте), которая бы всегда возвращала уникальный ИД диалога, но только нужно, чтобы ее использовали и мод ,и фильтрскрипты. При старте мода/фильтра генерируем этой функцией ИДы диалогов, которые будем использовать и помещаем их в глобальные для скрипта переменные с понятными названиями, например DLG_buyCar, DLG_sellCar, ... И далее по скрипту везде используем эти переменные вместо того, чтобы указывать числа (ИДы диалогов) вручную.
Reply
#4

а любые можно ID диалогов ставить
Reply
#5

[HHT]DRON, в разумных пределах. У меня есть и 2000 и больше, но если поставить уж очень большое, то будет плохо серверу
Reply
#6

блин(
у меня в админке
Код:
if(dialogid == 200)
а система покупки авто нет такого там вот так
Код:
if(dialogid == BUY_CAR_DIALOG)
и как поменять?
Reply
#7

найдите BUY_CAR_DIALOG в начале скрипта и рядом будет указано число, это и будет ИД диалога

думаю, в Вашем случае будет проще всего изменить или ИД вашей системы или ИДы в админке
Reply
#8

Вот паблик диалогов покукпи машин
Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == BUY_CAR_DIALOG)
	{
		if(response)
		{
			if(IsCarOwner(playerid))
		    {
		      SendClientMessage(playerid,COLOR_GREY,"VS: У вас уже есть машина");
		      TogglePlayerControllable(playerid,1);
		      RemovePlayerFromVehicle(playerid);
		      return 1;
		    }
			new thiscarprice = GetCarPrice( GetPlayerVehicleID(playerid) );
			if(GetPlayerMoney(playerid) < thiscarprice)
			{
				new tmpmoneystr[MAX_STRING];
				format(tmpmoneystr, sizeof(tmpmoneystr), "Для покупки нужно $%d", thiscarprice);
				SendClientMessage(playerid, COLOR_GREY, tmpmoneystr);
				TogglePlayerControllable(playerid,1);
				RemovePlayerFromVehicle(playerid);
				return 1;
			}
			GivePlayerMoney(playerid,-thiscarprice);
			new dood[MAX_PLAYER_NAME];
			GetPlayerName(playerid, dood, sizeof(dood));
			AutoShowCars[IsAnAutoShowCar(GetPlayerVehicleID(playerid))-1] = INVALID_VEHICLE_ID;
			AddOwnedCar(GetPlayerVehicleID(playerid), playerid);
			SendClientMessage(playerid, COLOR_WHITE, "Транспорт приобретен обязательно припаркуйте его командой /park");
			TogglePlayerControllable(playerid,1);
			return 1;
		}
		TogglePlayerControllable(playerid,1);
		RemovePlayerFromVehicle(playerid);
		return 1;
	}
	if(dialogid == POLICE_DIALOG_ID)
	{
	    if(response && IsPlayerInAnyVehicle(playerid))
		{
		    new car = GetPlayerVehicleID(playerid);
			if(IsThisCarOwner(playerid, car))
			{
				new slot = GetOwnedCarSlot(car);
				if(GetPlayerMoney(playerid) >= OwnedCars[slot][OwnedCarFine]) {
					GivePlayerMoney(playerid, -OwnedCars[slot][OwnedCarFine]);
					new string[MAX_STRING];
					format(string, MAX_STRING, "Вы оплатили штраф %d$ (Причина: %s)", OwnedCars[slot][OwnedCarFine], OwnedCars[slot][OwnedCarFineReason]);
					OwnedCars[slot][OwnedCarFine] = 0;
					SaveOwnedCars();
					SendClientMessage(playerid, COLOR_WHITE, string);
					SendClientMessage(playerid, COLOR_WHITE, "Перепаркуйте машину на нужное место при помощи /park");
					return 1;
				}
				else {
				    SendClientMessage(playerid, COLOR_RED, "Недостаточно денег");
				}
			}
	    }
    	RemovePlayerFromVehicle(playerid);
	    return 1;
	}
    return 1;
}
вот паблик диалогов регистрации
Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == 201)
	{
		if(!strlen(inputtext)) return ShowPlayerDialog(playerid,201,DIALOG_STYLE_INPUT,"Регистрация","Ошибка: Вы не ввели пороль.\nПожалуйста введите пороль для регистрации аккаунта!","Регистр","Закрыть");
	    new playerfile[128], pname[MAX_PLAYER_NAME];
		GetPlayerName(playerid, pname, sizeof(pname));
		format(playerfile, sizeof(playerfile), "Admin/Users/%s.ini",pname);
	 	if(dini_Exists(playerfile)) return SendClientMessage(playerid, red, "Вы уже зарегистрированы!");
		new playerip[20];
		GetPlayerIp(playerid, playerip, sizeof(playerip));
		dini_Create(playerfile);
  		dini_IntSet(playerfile, "Password", udb_hash(inputtext));
		dini_Set(playerfile, "Ip", playerip);
		dini_IntSet(playerfile, "Level", 0);
		dini_IntSet(playerfile, "Cash", 0);
		dini_IntSet(playerfile, "Score", 0);
		logged[playerid] = 1;
		SendClientMessage(playerid, yellow, "Вы зарегистрировали свой аккаунт! Вы успешно залогинены.");
	}
	if(dialogid == 200)
	{
		if(!strlen(inputtext)) return ShowPlayerDialog(playerid,200,DIALOG_STYLE_INPUT,"Логин","Ошибка: Вы не ввели пароль.\nПожалуйста введите пороль для входа в аккаунт!","Логин","Закрыть");
	    new playerfile[100], pname[MAX_PLAYER_NAME];
		GetPlayerName(playerid, pname, sizeof(pname));
		format(playerfile, sizeof(playerfile), "Admin/Users/%s.ini",pname);
	 	if(!dini_Exists(playerfile)) return SendClientMessage(playerid, red, "Ваш аккаунт не зарегистрирован пожалуйста используйте /register.");
		new tmp[256];
		tmp = dini_Get(playerfile, "Password");
    	if(udb_hash(inputtext) == strval(tmp))
    	{
		new playerip[20];
		GetPlayerIp(playerid, playerip, sizeof(playerip));
		level[playerid] = dini_Int(playerfile, "Level");
		logged[playerid] = 1;
		dini_Set(playerfile, "Ip", playerip);
		GivePlayerMoney(playerid, dini_Int(playerfile, "Cash"));
		SetPlayerScore(playerid, dini_Int(playerfile, "Score"));
		logged[playerid] = 1;
		SendClientMessage(playerid, yellow, "Вы успешно авторизованны!");
		} else return ShowPlayerDialog(playerid,200,DIALOG_STYLE_INPUT,"Логин","Ошибка: Не правильный пороль.\nПожалуйста введите пороль для входа в аккаунт!","Логин","Закрыть");
	}
	return 1;
}
помогите сделать так чтобы и рега и покупка работала
Reply
#9

Вот что в начале скрипта
Код:
{
  BUY_CAR_DIALOG,
  POLICE_DIALOG_ID
}
Reply
#10

как я и говорил, проще всего изменить ИДы или там, или там, допустим, в нижнем коде 201 поменять на 2001, 200 на 2000
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)