PHP код:
#include <a_samp>
#include <sscanf2>
#include <izcmd>
#define SCM(%0,%1) SendClientMessage(%0,-1,%1)
#define INV_MAX_SLOT 20
#define INV_MAX_STUFF 5 // +43 из них это все оружие
enum EnumPlayerInv
{
i_stuffid,
i_value,
i_string[32],
Float: i_float
};
new
pname[MAX_PLAYERS][24],
invinfo[MAX_PLAYERS][INV_MAX_SLOT][EnumPlayerInv],
invstuff[INV_MAX_STUFF][32] =
{
"Паспорт",
"Медицинская карта",
"Права категории 'A'",
"Права категории 'B'",
"Права категории 'C'"
},
WEAPON_ID[MAX_PLAYERS][13],
WEAPON_AMMO[MAX_PLAYERS][13],
WEAPON_INVSLOT[MAX_PLAYERS][13]
;
public OnFilterScriptInit()
{
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, pname[playerid], 24);
for(new i = 0; i < INV_MAX_SLOT; i++)
{
if(i < 13)
{
WEAPON_ID[playerid][i] = 0;
WEAPON_AMMO[playerid][i] = 0;
WEAPON_INVSLOT[playerid][i] = -1;
}
invinfo[playerid][i][i_stuffid] = 0;
}
SCM(playerid, "Открыть инвентарь: Y, добавить предмет: /addstuff, удалить предмет: /delstuff, сортировка по количеству: /inv1, сортировка по алфавиту: /inv2");
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
new slot = GetSlotWeaponID(weaponid);
if(WEAPON_AMMO[playerid][slot] > 0)
{
WEAPON_AMMO[playerid][slot]--;
invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_value]--;
if(WEAPON_AMMO[playerid][slot] == 0)
{
invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_stuffid] = 0;
WEAPON_ID[playerid][slot] = 0;
WEAPON_INVSLOT[playerid][slot] = -1;
}
}
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & 65536)
{
new dialogInfo[64*INV_MAX_SLOT], count = 0;
for(new i = 0; i < INV_MAX_SLOT; i++)
{
if(!invinfo[playerid][i][i_stuffid]) continue;
new weaponname[32];
if(invinfo[playerid][i][i_stuffid] < 47)
GetWeaponName(invinfo[playerid][i][i_stuffid], weaponname, sizeof weaponname);
format(dialogInfo, sizeof dialogInfo, "%s%i. %s (кол-во: %d)\n",
dialogInfo,
i+1,
(invinfo[playerid][i][i_stuffid] > 46) ? (invstuff[invinfo[playerid][i][i_stuffid]-47]) : (weaponname),
invinfo[playerid][i][i_value]
);
count++;
}
ShowPlayerDialog(playerid, 789, DIALOG_STYLE_LIST, "Инвентарь", (!count) ? ("У вас нет предметов") : (dialogInfo), "Выбрать", "Закрыть");
}
return 1;
}
public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case 789:
{
if(!response || !strval(inputtext)) return 1;
new str[73];
format(str, 66, "Выбран слот #%i.", strval(inputtext));
SCM(playerid, str);
}
}
return 1;
}
COMMAND:addstuff(playerid, params[])
{
new stuffid, value, string[32], floatt;
if(sscanf(params, "ids[32]f", stuffid, value, string, floatt)) return SCM(playerid, "Используйте: /additem [ид предмета] [кол-во] [string] [float]");
new slot = FindFreeInvSlot(playerid);
if(slot == -1) return SCM(playerid, "В вашем инвентаре нет свободного слота. Чтобы удалить предмет, введите /invdel");
if(1 > stuffid || stuffid > 46+INV_MAX_STUFF || stuffid == 19 || stuffid == 20 || stuffid == 21)
return SCM(playerid, "Допустимые иды предметов: 1-46 - оружие, 47 - паспорт, 48 - мед.карта, 49 - права A, 50 - права B, 51 - права C.");
if(1 > value || value > 1000) return SCM(playerid, "Количество может быть от 1 до 1000.");
if(strlen(string) > 32) return SCM(playerid, "String не должен иметь более 32 символов.");
if(0.0 > floatt || floatt > 1000.0) return SCM(playerid, "Float может быть от 0.0 до 1000.0.");
if(stuffid > 46)
{
invinfo[playerid][slot][i_stuffid] = stuffid;
invinfo[playerid][slot][i_value] = value;
strmid(invinfo[playerid][slot][i_string], string, 0, strlen(string), 32);
invinfo[playerid][slot][i_float] = floatt;
}
else GiveWeapon(playerid, stuffid, value);
new str[73];
format(str, 66, "Вы добавили предмет в ваш инвентарь. Предмет занесен в #%d слот.", slot+1);
SCM(playerid, str);
if(stuffid < 47) GetWeaponName(stuffid, str, sizeof str);
format(str, 73, "Название предмета: %s (ид предмета: %i)", (stuffid > 46) ? (invstuff[stuffid-47]) : (str), stuffid);
SCM(playerid, str);
format(str, 16, "Количество: %d", value);
SCM(playerid, str);
format(str, 42, "String: %s", string);
SCM(playerid, str);
format(str, 11, "Float: %f", floatt);
SCM(playerid, str);
return 1;
}
COMMAND:delstuff(playerid, params[])
{
new slot;
if(sscanf(params, "i", slot)) return SCM(playerid, "Используйте: /delstuff [номер слот]");
if(1 > slot || slot > INV_MAX_SLOT) return SCM(playerid, "Номер слота может быть от 1 до 20.");
slot--;
if(!invinfo[playerid][slot][i_stuffid]) return SCM(playerid, "В этом слоте нет предмета.");
if(invinfo[playerid][slot][i_stuffid] > 46)
{
invinfo[playerid][slot][i_stuffid] = 0;
invinfo[playerid][slot][i_value] = 0;
invinfo[playerid][slot][i_string] = EOS;
invinfo[playerid][slot][i_float] = 0.0;
}
else ResetWeapon(playerid, GetSlotWeaponID(invinfo[playerid][slot][i_stuffid]));
new str[32];
format(str, 32, "Вы удалили предмет в #%i слоте.", slot+1);
SCM(playerid, str);
return 1;
}
COMMAND:inv1(playerid, params[])
{
new _i = 1, _j = 2, parts[INV_MAX_SLOT];
for(new i = 0; i < INV_MAX_SLOT; i++)
{
parts[i] = i;
}
while(_i < INV_MAX_SLOT)
{
if(invinfo[playerid][parts[_i-1]][i_value] > invinfo[playerid][parts[_i]][i_value])
{
_i = _j;
_j++;
}
else
{
parts[_i] += parts[_i-1];
parts[_i-1] = parts[_i]-parts[_i-1];
parts[_i] -= parts[_i-1];
_i--;
if(_i == 0)
{
_i = _j;
_j++;
}
}
}
new dialogInfo[64*INV_MAX_SLOT], count = 0;
for(new i = 0; i < INV_MAX_SLOT; i++)
{
if(!invinfo[playerid][parts[i]][i_stuffid]) continue;
new weaponname[32];
if(invinfo[playerid][parts[i]][i_stuffid] < 47)
GetWeaponName(invinfo[playerid][parts[i]][i_stuffid], weaponname, sizeof weaponname);
format(dialogInfo, sizeof dialogInfo, "%s%i. %s (кол-во: %d)\n",
dialogInfo,
parts[i]+1,
(invinfo[playerid][parts[i]][i_stuffid] > 46) ? (invstuff[invinfo[playerid][parts[i]][i_stuffid]-47]) : (weaponname),
invinfo[playerid][parts[i]][i_value]
);
count++;
}
ShowPlayerDialog(playerid, 789, DIALOG_STYLE_LIST, "Инвентарь (сортировка по количеству в убывание)", (!count) ? ("У вас нет предметов") : (dialogInfo), "Выбрать", "Закрыть");
return 1;
}
FindFreeInvSlot(playerid)
{
new i;
for(i = 0; i < INV_MAX_SLOT+1; i++)
{
if(i == INV_MAX_SLOT) break;
if(!invinfo[playerid][i][i_stuffid])
{
break;
}
}
return (i == INV_MAX_SLOT) ? (-1) : (i);
}
GetSlotWeaponID(weaponid)
{
switch(weaponid)
{
case 0, 1: return 0;
case 2..9: return 1;
case 10..15: return 10;
case 16..18, 39: return 8;
case 22..24: return 2;
case 25..27: return 3;
case 28, 29, 32: return 4;
case 30, 31: return 5;
case 33, 34: return 6;
case 35..38: return 7;
case 40: return 12;
case 41..43: return 9;
case 44..46: return 11;
}
return -1;
}
GiveWeapon(playerid, gunid, ammo)
{
new invslot = FindFreeInvSlot(playerid);
if(invslot == -1) return 1;
new slot = GetSlotWeaponID(gunid);
if(slot == -1) return 1;
invinfo[playerid][invslot][i_stuffid] = gunid;
invinfo[playerid][invslot][i_value] = ammo;
WEAPON_ID[playerid][slot] = gunid;
WEAPON_AMMO[playerid][slot] = ammo;
WEAPON_INVSLOT[playerid][slot] = invslot;
GivePlayerWeapon(playerid, gunid, ammo);
return 1;
}
ResetWeapon(playerid, slot)
{
ResetPlayerWeapons(playerid);
WEAPON_ID[playerid][slot] = 0;
WEAPON_AMMO[playerid][slot] = 0;
invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_stuffid] = 0;
invinfo[playerid][WEAPON_INVSLOT[playerid][slot]][i_value] = 0;
WEAPON_INVSLOT[playerid][slot] = -1;
for(new i = 0; i < 13; i++)
{
if(!WEAPON_ID[playerid][i]) continue;
GivePlayerWeapon(playerid, WEAPON_ID[playerid][i], WEAPON_AMMO[playerid][i]);
}
return 1;
}