Dark_Ilya
Компетентный
Данная система идёт к теме Система магазина из IRolePlay и RakNet http://pawno-info.ru/threads/188872-Система-магазина-из-IRolePlay-и-RakNet?p=1266602#post1266602
Не буду объяснять как он работает, думаю вы итак поймёте по названию темы
Ко всем define
Ко всем new
Создаём стоки, кстати в этой версии добавлено занятость инвентаря, игрок может носить с собой только 20 кг.
К командам
В диалоги, а именно в switch(dialogid)
Если будет ругаться на TotalVehicles
Если будут ошибки пишите, т.к. система большая я уже не помню, что где находится 
Не буду объяснять как он работает, думаю вы итак поймёте по названию темы
Ко всем define
PHP:
#define ALL_ITEMS_SIZE 25
PHP:
new PlayerGUIItems[MAX_PLAYERS][ALL_ITEMS_SIZE];
enum item_info
{
item_name[24],
item_effect,
item_size
}
new Items_All[ALL_ITEMS_SIZE][item_info] = {
{"Маска",0,120},
{"Фотоплёнка",1,20},
{"Фотоаппарат",2,1350},
{"Трос",3,400},
{"Удочка",4,280},
{"Рация",5,120},
{"Часы",6,37},
{"Аптечка",7,40},
{"Огнетушитель",8,500},
{"Золото",9,1},
{"Навигатор",10,300},
{"Инструменты",11,150},
{"Продукты",12,2},
{"Рыба",13,30},
{"Лопата",14,200},
{"Дигл",15,500},
{"Дробовик",16,600},
{"МП5",17,500},
{"М4",18,900},
{"Патроны 9 мм",19,2},
{"Патроны 5.56 мм",20,2},
{"Патроны 14.7 мм",21,2},
{"Патроны 12 мм",22,2},
{"Кольт",23,500},
{"АК-47",24,900}
};
new PlayerItems[MAX_PLAYERS][ALL_ITEMS_SIZE];
PHP:
stock AcceptItemEffect(playerid,itemid)
{
if(itemid < 0 || itemid >= ALL_ITEMS_SIZE) return true;
if(PlayerItems[playerid][itemid] == 0) return true;
new string[100]; SetPVarInt(playerid,"inventory",itemid);
format(string,100,"Инвентарь: %s %d шт.",Items_All[itemid][item_name],PlayerItems[playerid][itemid]);
SPD(playerid,INVENTORY_APPLY_DIALOG,DIALOG_STYLE_LIST,string,"Использовать\nПередать\nВыкинуть\nПоложить в машину","Выбрать","Назад");
return true;
}
stock ApplyInventory(playerid,modelid)
{
new string[60];
switch(modelid)
{
case 0:
{
if(Mask[playerid] == false)SetPlayerColor(playerid, 0xAAAAAA00),format(string,sizeof(string),"%s одел маску",PlayerInfo[playerid][pName]),Mask[playerid] = true;
else ChangePlayerColor(playerid),format(string,sizeof(string),"%s снял маску",PlayerInfo[playerid][pName]),Mask[playerid] = false;
ProxDetector(30.0,playerid,string,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
PlayerItems[playerid][0]--;
}
case 1:
{
if(PlayerItems[playerid][1] < 1)SCM(playerid,COLOR_WHITE,"Купив фотоаппарат и плёнку,Вы сможете собрать его.");
else SCM(playerid,COLOR_WHITE,"Вы можете собрать фотоаппарат,если он у вас есть");
}
case 2:
{
if(PlayerItems[playerid][2] > 0 && PlayerItems[playerid][1] > 29)
{
GivePlayerWeaponAC(playerid,43,30);
PlayerItems[playerid][1] -= 30;
PlayerItems[playerid][2] --;
format(string,sizeof(string),"%s достал фотоаппарат",PlayerInfo[playerid][pName]);
ProxDetector(30.0,playerid,string,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
}
}
case 3:
{
new vehplid=GetPlayerVehicleID(playerid);
if(IsABMX(vehplid) || IsAPlane(vehplid) || IsAMoto(vehplid)) return SCM(playerid,COLOR_GREY,"К этому транспортному средству не возможно прицепить трос!");
if(VehicleInfo[vehplid][vTros] == false)
{
if(PlayerItems[playerid][3] != 1) return SCM(playerid,COLOR_GREY,"У вас нет троса!");
new Float:plAngle; GetVehicleZAngle(vehplid, plAngle);
new Float:crAngle,Float:Angle,Float:Angle2;
//====================
new Float:posx, Float:posy, Float:posz;
new Float:oldposx, Float:oldposy, Float:oldposz;
new Float:tempposx, Float:tempposy, Float:tempposz;
new Float:Radi=6.0; //Расстояние от тачки
new Float:AngRange=90.0; //максимальный радиус
//======================
for(new i = 0; i <= TotalVehicles(); i++) //700
{
if(i == vehplid) continue; //себя цеплять ненадо
if(IsAPlane(i)) continue;
//======
GetVehiclePos(vehplid, posx, posy, posz); //координаты тачки
GetVehiclePos(i, oldposx, oldposy, oldposz); //координаты ближайшей
tempposx = (oldposx -posx);
tempposy = (oldposy -posy);
tempposz = (oldposz -posz);
if (((tempposx < Radi) && (tempposx > -Radi)) && ((tempposy < Radi) && (tempposy > -Radi)) && ((tempposz < Radi) && (tempposz > -Radi)))
{
GetVehicleZAngle(i, crAngle);
Angle = (plAngle -crAngle);
Angle2= (Angle-180.0);
if (( ((Angle < AngRange) && (Angle > -AngRange)) || ((Angle2 < AngRange) && (Angle2 > -AngRange)) ))
{
AttachTrailerToVehicle(i, vehplid);
PlayerItems[playerid][3] = 0;
VehicleInfo[vehplid][vTros] = true;
SCM(playerid,COLOR_WHITE,"Вы прицепили автомобиль тросом");
break;
}
}
}
}
else
{
PlayerItems[playerid][3] = 1;
DetachTrailerFromVehicle(vehplid);
VehicleInfo[vehplid][vTros] = false;
SCM(playerid,COLOR_WHITE,"Вы отцепили автомобиль");
return true;
}
}
case 4:
{
if(PlayerItems[playerid][4] > 0)SCM(playerid,COLOR_WHITE,"Информация: Идите на пирс, там можно порыбачить");
}
case 5:ShowPlayerDialog(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Используйте команды:\n* /channel - подключиться\n* /rc - отправить сообщение","Закрыть","");
case 6:
{
if(PlayerItems[playerid][6] < 1)return SCM(playerid,COLOR_WHITE,"У вас нет часов!");
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)ApplyAnimation(playerid,"COP_AMBIENT","Coplook_watch",4.1,0,0,0,0,0);
format(string, sizeof(string), "* %s cмотрит на свои часы.",PlayerInfo[playerid][pName]);
ProxDetector(25.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
new mtext[20], year, month,day; getdate(year, month, day);
switch(month)
{
case 1:mtext = "Jan";
case 2:mtext = "Feb";
case 3:mtext = "Mar";
case 4:mtext = "Apr";
case 5:mtext = "May";
case 6:mtext = "Jun";
case 7:mtext = "Jul";
case 8:mtext = "Aug";
case 9:mtext = "Sep";
case 10:mtext = "Oct";
case 11:mtext = "Nov";
case 12:mtext = "Dec";
default:mtext = "Jan";
}
new hour,minuite,second; gettime(hour,minuite,second);
FixHour(hour);
hour = shifthour;
if(minuite < 10)
{
if(PlayerInfo[playerid][pJailTime] > 0)format(string, sizeof(string), "~y~%d %s~n~~g~|~w~%d:0%d~g~|~n~~w~Jail Time Left: %d sec", day, mtext, hour, minuite, PlayerInfo[playerid][pJailTime]-10);
else format(string, sizeof(string), "~y~%d %s~n~~g~|~w~%d:0%d~g~|", day, mtext, hour, minuite);
}
else
{
if(PlayerInfo[playerid][pJailTime] > 0)format(string, sizeof(string), "~y~%d %s~n~~g~|~w~%d:%d~g~|~n~~w~Jail Time Left: %d sec", day, mtext, hour, minuite, PlayerInfo[playerid][pJailTime]-10);
else format(string, sizeof(string), "~y~%d %s~n~~g~|~w~%d:%d~g~|", day, mtext, hour, minuite);
}
GameTextForPlayer(playerid, string, 5000, 1);
}
case 7:
{
if(PlayerItems[playerid][7] < 1) return SendClientMessage(playerid, COLOR_GREY, "У вас нет аптечек!");
new Float: HP;
GetPlayerHealth(playerid, HP);
if(HP >= 90) return SendClientMessage(playerid,-1, "Твое здоровье в норме.");
SetPlayerHealthAC(playerid, HP+30);
PlayerItems[playerid][7]--;
}
case 8:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Если ваше авто загориться,можно потушить его огнетушителем.","Закрыть","");
case 9:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Золото можно продать в магазине или сделать слиток золота","Закрыть","");
case 10:OnPlayerCommandText(playerid, "/gps");
case 11:
{
if(PlayerItems[playerid][11] < 1) return SendClientMessage(playerid, COLOR_GREY, "У вас нет инструментов!");
if(IsPlayerInAnyVehicle(playerid)) return SCM(playerid,COLOR_GREY,"Информация: Нельзя использовать внутри транспорта");
for(new i = 0; i <= TotalVehicles(); i++)
{
new Float:lcx,Float:lcy,Float:lcz;
GetCoordBonnetVehicle(i, lcx, lcy, lcz);
if(IsPlayerInRangeOfPoint(playerid,2,lcx,lcy,lcz))
{
if(NoValidVehicle(i)) return SCM(playerid,COLOR_GREY,"Информация: В этом транспорте нет капота");
if(IsCarLocked(i)) return SCM(playerid,COLOR_GREY,"Информация: Транспорт закрыт");
if(VehicleBonnet[i] == 0) return SCM(playerid,COLOR_GREY,"Информация: капот закрыт");
new Float:vhealth;
GetVehicleHealth(i, vhealth);
SetVehicleHealth(i,vhealth+200.0);
if(GetVehicleHealth(i, vhealth) > 1000.0)SetVehicleHealth(i,1000.0);
SendClientMessage(playerid, COLOR_GREY, "Вы починили двигатель.");
PlayerItems[playerid][11] --;
break;
}
}
}
case 12:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Подойдите к холодильнику и выложите все продукты туда...","Закрыть","");
case 13:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Рыбу можно продать в магазине","Закрыть","");
case 14:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Не доработано","Закрыть","");
case 15:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: Desert Eagle\nКалибр патронов: 14.7 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",1);
case 16:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: Дробовик\nКалибр патронов: 12 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",2);
case 17:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: МП5\nКалибр патронов: 9 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",3);
case 18:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: М4\nКалибр патронов: 5.56 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",4);
case 19:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Калибр патронов 9 мм\nПатроны подходят к пистолету 9мм,МП5","Закрыть","");
case 20:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Калибр патронов 5.56 мм\nПатроны подходят к М4","Закрыть","");
case 21:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Калибр патронов 14.7 мм\nПатроны подходят к Desert Eagle","Закрыть","");
case 22:SPD(playerid,DIALOG_NULL,DIALOG_STYLE_MSGBOX,"Подсказка","Калибр патронов 12 мм\nПатроны подходят к дробовику","Закрыть","");
case 23:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: Кольт\nКалибр патронов: 9 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",5);
case 24:SPD(playerid,DIALOG_ZARADGUN,DIALOG_STYLE_INPUT,"Зарядка оружия","Введите количество патронов которое хотите зарядить\nИнформация об оружии:\nНаименование: АК-47\nКалибр патронов: 5.56 мм","Зарядить","Отмена"),SetPVarInt(playerid,"ZaradkaGana",6);
}
return true;
}
//7136
stock TransferInventory(playerid,transferid,modelid)
{
if(!IsPlayerConnected(transferid)) return SendClientMessage(playerid,COLOR_GREY," ИНФО: Игрок не в сети");
if(!ProxDetectorS(2.0,playerid,transferid)) return SendClientMessage(playerid,COLOR_GREY," ИНФО: Игрок далеко от вас");
new string[200];
format(string,sizeof(string),"* %s передал %s предмет %s",PlayerInfo[playerid][pName],PlayerInfo[transferid][pName],Items_All[modelid][item_name]);
ProxDetector(30.0,playerid,string,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
PlayerItems[transferid][modelid] = PlayerItems[playerid][modelid];
PlayerItems[playerid][modelid] = 0;
DeletePVar(playerid,"inventory");
return true;
}
stock TransferManyInventory(playerid,transferid,modelid,many)
{
if(!IsPlayerConnected(transferid)) return SendClientMessage(playerid,COLOR_GREY," ИНФО: Игрок не в сети");
if(!ProxDetectorS(2.0,playerid,transferid)) return SendClientMessage(playerid,COLOR_GREY," ИНФО: Игрок далеко от вас");
new string[200];
format(string,sizeof(string),"* %s передал %s предмет %s",PlayerInfo[playerid][pName],PlayerInfo[transferid][pName],Items_All[modelid][item_name]);
ProxDetector(30.0,playerid,string,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
PlayerItems[transferid][modelid] += many;
PlayerItems[playerid][modelid] -= many;
DeletePVar(playerid,"inventory");
return true;
}
stock RemoveInventory(playerid,modelid,kolvo)
{
new string[60];
format(string,60," ИНФО: Вы выкинули из инвентаря %s %d",Items_All[modelid][item_name],kolvo);
SendClientMessage(playerid,COLOR_GREY,string);
PlayerItems[playerid][modelid]-=kolvo;
return true;
}
GetPlayerItemString(playerid)
{
new string[1024],idx;
for(new i=0;i<ALL_ITEMS_SIZE;i++)
{
if(PlayerItems[playerid][i] > 0)
{
format(string,sizeof(string),"%s%s: [%d гр.][%d ед.]\n",string,Items_All[i][item_name],Items_All[i][item_size],PlayerItems[playerid][i]);
PlayerGUIItems[playerid][idx] = i;
idx++;
}
}
if(!strlen(string))
{
format(string,sizeof(string),"Пусто");
PlayerGUIItems[playerid][idx] = -1;
}
return string;
}
stock InventToPercent(playerid)
{
new a,b,c;
a = 0,b = 0;
for(new i=0;i<ALL_ITEMS_SIZE;i++)
{
if(PlayerItems[playerid][i] > 0)
{
a = PlayerItems[playerid][i]*Items_All[i][item_size];
b += a;
}
}
c = b/200;
return c;
}
PHP:
else if(StrCmp(cmd, "/inv"))
{
if(InventToPercent(playerid) > 100)SCM(playerid,COLOR_GREY,"Ваш инвентарь заполнен, выкиньте что-нибудь!!!"),TogglePlayerControllable(playerid,0);
else TogglePlayerControllable(playerid,1);
format(string,55,"Инвентарь[%d процентов]: вес указан за 1 шт",InventToPercent(playerid));
SPD(playerid,INVENTORY_PLAYER_DIALOG,DIALOG_STYLE_LIST,string,GetPlayerItemString(playerid),"Выбрать","Выход");
return true;
}
PHP:
case INVENTORY_PLAYER_DIALOG:
{
if(response)
{
if(PlayerGUIItems[playerid][listitem] == -1) return true;
new itemID = PlayerGUIItems[playerid][listitem];
AcceptItemEffect(playerid,itemID);
}
return true;
}
case INVENTORY_APPLY_DIALOG:
{
if(response)
{
if(listitem == 0)
{
ApplyInventory(playerid,GetPVarInt(playerid,"inventory"));
DeletePVar(playerid,"inventory");
}
else if(listitem == 1)
{
format(string,85,"Введите ид игрока и колличество которому хотите отдать %s:\nНапример: 1.100",Items_All[GetPVarInt(playerid,"inventory")][item_name]);
SPD(playerid,INVENTORY_MANY_TRANSFER_DIALOG,DIALOG_STYLE_INPUT,"Передать предмет",string,"Ок","Выход");
}
else if(listitem == 2)
{
if(GetPVarInt(playerid,"inventory") == 24)DropGun(playerid, 30);
else if(GetPVarInt(playerid,"inventory") == 18)DropGun(playerid, 31);
else if(GetPVarInt(playerid,"inventory") == 16)DropGun(playerid, 25);
else if(GetPVarInt(playerid,"inventory") == 17)DropGun(playerid, 29);
else if(GetPVarInt(playerid,"inventory") == 23)DropGun(playerid, 22);
else if(GetPVarInt(playerid,"inventory") == 15)DropGun(playerid, 24);
else format(string,80,"Введите сколько хотите выкинуть %s",Items_All[GetPVarInt(playerid,"inventory")][item_name]),SPD(playerid,Invenvotary_Dialog_Vikinyt,DIALOG_STYLE_INPUT,"Выкинуть предмет",string,"Ок","Выход");
}
else if(listitem == 3)
{
if(IsPlayerInAnyVehicle(playerid)) return SCM(playerid,COLOR_GREY,"Информация: Нельзя использовать внутри транспорта");
for(new i = 0; i <= TotalVehicles(); i++)
{
new Float:lcx,Float:lcy,Float:lcz;
GetCoordBootVehicle(i, lcx, lcy, lcz);
if(IsPlayerInRangeOfPoint(playerid,2,lcx,lcy,lcz))
{
if(NoValidVehicle(i)) return SCM(playerid,COLOR_GREY,"Информация: В этом транспорте нет багажника");
if(VehicleBoot[i] == 0) return SCM(playerid,COLOR_GREY,"Информация: багажник закрыт");
if(GetPVarInt(playerid,"inventory") != 8) return SCM(playerid,COLOR_GREY,"Информация: в данный момент вы не можете положить этот предмет");
if(PlayerItems[playerid][GetPVarInt(playerid,"inventory")] < 0) return SCM(playerid,COLOR_GREY,"Информация: у вас нет данного предмета");
SendFormatMSG(playerid,COLOR_WHITE,"Вы положили %s в багажник",Items_All[GetPVarInt(playerid,"inventory")][item_name]);
new bagaj;
if(GetPVarInt(playerid,"inventory") == 8) bagaj = 0;
TrunkItems[GetPVarInt(playerid,"VeHiCleId")][bagaj] ++;
PlayerItems[playerid][GetPVarInt(playerid,"inventory")] --;
break;
}
}
}
}
else
{
format(string,55,"Инвентарь[%d процентов]: вес указан за 1 шт",InventToPercent(playerid));
SPD(playerid,INVENTORY_PLAYER_DIALOG,DIALOG_STYLE_LIST,string,GetPlayerItemString(playerid),"Выбрать","Выход");
DeletePVar(playerid,"inventory");
}
return true;
}
case INVENTORY_MANY_TRANSFER_DIALOG:
{
new text[2][64];
if(response)
{
if(!strlen(inputtext))
{
// new string[85];
format(string,85,"Введите ид игрока и колличество которому хотите отдать %s:\nНапример: 1.100",Items_All[GetPVarInt(playerid,"inventory")][item_name]);
SPD(playerid,INVENTORY_MANY_TRANSFER_DIALOG,DIALOG_STYLE_INPUT,"Передать предмет",string,"Ок","Выход");
return true;
}
else if(strfind(inputtext,".", true) != -1)
{
split(inputtext,text,'.');
new transferid = strval(text[0]); new price = strval(text[1]);
if(price > PlayerItems[playerid][GetPVarInt(playerid,"inventory")] || price < 0) return SendClientMessage(playerid,COLOR_GREY," ИНФО: Неверное колличество");
new afd = (PlayerItems[transferid][GetPVarInt(playerid,"inventory")]*price)/200;
new procent = InventToPercent(transferid) + afd;
if(InventToPercent(transferid) >= 100 || procent > 100) return SCM(playerid,COLOR_WHITE,"Сумка данного человека полна, он не может принять ваши вещи...");
TransferInventory(playerid,transferid,GetPVarInt(playerid,"inventory"));
TransferManyInventory(playerid,transferid,GetPVarInt(playerid,"inventory"),price);
}
}
else
{
format(string,55,"Инвентарь[%d процентов]: вес указан за 1 шт",InventToPercent(playerid));
SPD(playerid,INVENTORY_PLAYER_DIALOG,DIALOG_STYLE_LIST,string,GetPlayerItemString(playerid),"Выбрать","Выход");
DeletePVar(playerid,"inventory");
}
return true;
}
PHP:
TotalVehicles()
{
new vid = CreateVehicle(411, 0, 0, 0, 0, -1, -1, 10);
DestroyVehicle(vid);
vid--;
return vid;
}
Последнее редактирование:
