PDA

Просмотр полной версии : [Вопрос] Команда по символам.



Skyline
05.05.2017, 19:47
Доброго времени суток, спасибо DeimoS за предыдущий ответ и помощь в команде, но возник другой вопрос, а именно, как определить в подтверждении команды какой символ был введен?

По коду будет думаю суть ясна...

switch(currency)
{
case '$':
{
if(!(1 <= price <= 100000000000000))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от $1.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за $%s. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за $%s.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
house_price{playerid} = true;

}
case 'м', 'М', 'm', 'M':
{
if(!(100 <= price <= 100000000000000))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 100 материалов.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s материалов. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s материалов.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
house_materials{playerid} = true;
}
case 'd', 'D':
{
if(!(1 <= price <= 100000000000000))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 1 грамма наркотиков");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s грамм нарко. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s грамм нарко.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
house_drugs{playerid} = true;
}

И команда /accept house

if(strcmp(accept, "house", true) == 0)
{
if(GetPVarInt(playerid,"BUYHOME") == 999)
return SendClientMessage(playerid, COLOR_GREY, !"Вам не кто не предлогал купить дом.");

if(pInfo[playerid][pMoney] < GetPVarInt(playerid,"BUYCENA"))
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно средств.");

new sellpl = GetPVarInt(playerid,"BUYHOME");
pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = 0;
strmid(HouseInfo[pInfo[playerid][pHouse]][hOwner], pInfo[playerid][pName], 0, strlen(pInfo[playerid][pName]), 255);
UpdateHouse(pInfo[playerid][pHouse]);

if(house_price{playerid} == true && house_materials{playerid} == false && house_drugs{playerid} == false)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d$.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d$.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMoney] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pMoney] += GetPVarInt(playerid, "BUYCENA");
house_price{playerid} = false;
}
if(house_price{playerid} == false && house_materials{playerid} == true && house_drugs{playerid} == false)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d материалов.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d материалов.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMats] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pMats] += GetPVarInt(playerid, "BUYCENA");
house_materials{playerid} = false;
}
if(house_price{playerid} == false && house_materials{playerid} == false && house_drugs{playerid} == true)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d грамм нарко.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d грамм нарко.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pDrugs] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pDrugs] += GetPVarInt(playerid, "BUYCENA");
house_drugs{playerid} = false;
}
SetPVarInt(playerid,"BUYHOME",999);
SetPVarInt(playerid,"BUYCENA",0);
}

Я не знаю как сделать проверку на введеный символ, т.е. за какой материальный предмет продает игрок дом.
Подскажите пожалуйста, может есть проще и лучше вариант.

ziggi
05.05.2017, 20:09
Это же уже реализовано с помощью массивов house_price, house_materials и house_drugs.
Правда, лучше это реализовать так:

enum {
SELL_HOUSE_CURRENCY_DOLLAR,
SELL_HOUSE_CURRENCY_MATERIAL,
SELL_HOUSE_CURRENCY_DRUGS,
}

new gSellHouseCurrency[MAX_PLAYERS char];
(ещё можно использовать теги, по желанию)


switch(currency)
{
case '$':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от $1.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за $%s. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за $%s.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
gSellHouseCurrency{playerid} = SELL_HOUSE_CURRENCY_DOLLAR;
}
case 'м', 'М', 'm', 'M':
{
if(!(100 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 100 материалов.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s материалов. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s материалов.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
gSellHouseCurrency{playerid} = SELL_HOUSE_CURRENCY_MATERIAL;
}
case 'd', 'D':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 1 грамма наркотиков");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s грамм нарко. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s грамм нарко.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
gSellHouseCurrency{playerid} = SELL_HOUSE_CURRENCY_DRUGS;
}
P.S. Я заменил 100000000000000 на cellmax.


if(strcmp(accept, "house", true) == 0)
{
if(GetPVarInt(playerid,"BUYHOME") == 999)
return SendClientMessage(playerid, COLOR_GREY, !"Вам не кто не предлогал купить дом.");

if(pInfo[playerid][pMoney] < GetPVarInt(playerid,"BUYCENA"))
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно средств.");

new sellpl = GetPVarInt(playerid,"BUYHOME");
pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = 0;
strmid(HouseInfo[pInfo[playerid][pHouse]][hOwner], pInfo[playerid][pName], 0, strlen(pInfo[playerid][pName]), 255);
UpdateHouse(pInfo[playerid][pHouse]);

if(gSellHouseCurrency{playerid} == SELL_HOUSE_CURRENCY_DOLLAR)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d$.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d$.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMoney] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pMoney] += GetPVarInt(playerid, "BUYCENA");
}
else if(gSellHouseCurrency{playerid} == SELL_HOUSE_CURRENCY_MATERIAL)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d материалов.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d материалов.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMats] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pMats] += GetPVarInt(playerid, "BUYCENA");
}
else if(gSellHouseCurrency{playerid} == SELL_HOUSE_CURRENCY_DRUGS)
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d грамм нарко.",pInfo[sellpl][pName], GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d грамм нарко.",pInfo[playerid][pName],GetPVarInt(playerid,"BUYCENA"));
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pDrugs] -= GetPVarInt(playerid, "BUYCENA");
pInfo[sellpl][pDrugs] += GetPVarInt(playerid, "BUYCENA");
}
SetPVarInt(playerid,"BUYHOME",999);
SetPVarInt(playerid,"BUYCENA",0);
}

DeimoS
05.05.2017, 20:18
Ну, во-первых, такого числа чисто физически в Pawn не может быть :)


100000000000000

Вот-вторых, я бы сделал как-то так:


if(GetPVarType(giveplayerid, "SellHouse_Currency") != PLAYER_VARTYPE_NONE)
return SendClientMessage(playerid, COLOR_GREY, !"Данному игроку уже сделали предложение по продаже дома.");
switch(currency)
{
case '$':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от $1.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за $%s. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", '$');// Можно, конечно, обычные "1, 2, 3" использовать, но так, как по мне, нагляднее

format(string, sizeof string,"Ты предложил купить дом игроку %s за $%s.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
house_price{playerid} = true;

}
case 'м', 'М', 'm', 'M':
{
if(!(100 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 100 материалов.");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s материалов. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", 'M');

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s материалов.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
house_materials{playerid} = true;
}
case 'd', 'D':
{
if(!(1 <= price <= cellmax))
return SendClientMessage(playerid, COLOR_GREY, !"Цена от 1 грамма наркотиков");

static const fmt_str[] = "Игрок %s предложил вам купить дом за %s грамм нарко. Для покупки введите /accept house";
new string[sizeof(fmt_str) - 4 + MAX_PLAYER_NAME + 25];
format(string, sizeof string, fmt_str, pInfo[playerid][pName], money);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
SetPVarInt(giveplayerid, "SellHouse_Currency", 'D');

format(string, sizeof string,"Ты предложил купить дом игроку %s за %s грамм нарко.",pInfo[giveplayerid][pName], money);
SendClientMessage(playerid,COLOR_YELLOW,string);
}





if(strcmp(accept, "house", true) == 0)
{
if(GetPVarType(playerid, "BUYHOME") == PLAYER_VARTYPE_NONE)
return SendClientMessage(playerid, COLOR_GREY, !"Вам не кто не предлогал купить дом.");

new price = GetPVarInt(playerid, "BUYCENA"),
sellpl = GetPVarInt(playerid,"BUYHOME");
DeletePVar(playerid,"BUYHOME");
DeletePVar(playerid,"BUYCENA");

if(pInfo[playerid][pMoney] < price)
return SendClientMessage(playerid, COLOR_GREY, !"У вас недостаточно средств.");


switch(GetPVarInt(playerid, "SellHouse_Currency"))
{
case '$':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d$.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d$.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMoney] -= price;
pInfo[sellpl][pMoney] += price;
}
case 'M':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d материалов.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d материалов.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pMats] -= price;
pInfo[sellpl][pMats] += price;
}
case 'D':
{
format(string,sizeof string, "Вы купили дом у игрока %s за %d грамм нарко.",pInfo[sellpl][pName], price);
SendClientMessage(playerid, COLOR_LBLUE, string);
format(string,sizeof string ,"Вы продали дом игроку %s за %d грамм нарко.",pInfo[playerid][pName],price);
SendClientMessage(sellpl, COLOR_LBLUE, string);

pInfo[playerid][pDrugs] -= price;
pInfo[sellpl][pDrugs] += price;
}
}
new houseid = pInfo[playerid][pHouse] = pInfo[sellpl][pHouse];
pInfo[sellpl][pHouse] = HouseInfo[houseid][hOwner][0] = 0;
strcat(HouseInfo[houseid][hOwner], pInfo[playerid][pName], MAX_PLAYER_NAME);
UpdateHouse(houseid);

DeletePVar(playerid, "SellHouse_Currency");
return 1;
}

И забудь вообще о том, что у pVar могут быть какие-то значения по умолчанию. Если pVar больше не будет использоваться, значит его следует удалить и если твоя система не позволяет этого (хотя для проверки существования pVar есть прекрасная функция GetPVarType), то стоит либо отказаться от использования pVar в ней, либо переписать систему. В противном случае ты лишь проигрываешь с подобным использованием pVar