Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Рекомандация поставить стример от инкогнито, и интегрировать этот ФС в мод. так же, найти закоментеную систему удаления оружия через семь дней, и включить её самостоятельно.
- #include <a_samp>
- #include <core>
- #include <file>
- #include <streamer>
- // если нет стримера...
- //измените:
- // CreateDynamicObject на CreateObject,
- // SetDynamicObjectPos - SetObjectPos,
- // DeleteDynamicObject - DeleteObject,
- //и измените MAX_DGUNS на 100 или меньше
- #define MAX_DGUNS 2048 //помоему оптимальное число (для динам. объектов)
- enum GunsI
- {
- g_gid, g_exist, g_gun, g_ammo, g_date, Float:g_c[4],
- }
- new DGuns[MAX_DGUNS][GunsI];
- new Split[MAX_DGUNS][16];
- new ts[256];
- new bigone[4096]; // если не устраивает размер...
- new dialnearguns = 114, dialsameguns = 115; // можете поставить свои значения, если уже используюься
- forward LoadDGuns();
- public OnFilterScriptInit()
- {
- // сдесь типо нада написать какуюнить бесполезную хрень, типо такойто скрипт, от такого то автора, успешно загружен?))
- LoadDGuns(); // когда то же они должны загружаться? хтя можно и без этого.
- return 1;
- }
- public OnFilterScriptExit()
- {
- SaveDGuns(); // выберите сами, когда оружие будет сохраняться. если не будут - как хотите
- return 1;
- }
- main(){}
- stock GetWeaponNameEx(gun) // 90% имен смотрел на gta-wikia.com, там приведены самые вероятные имена оружий и машин
- {
- new z[32];
- switch(gun)
- {
- case 0: z = "Кулак"; // у себя на сервере использую вот такие имена оружий. уберите комент, что бы тоже их использовать.
- /*
- case 1: z = "Кастет";
- case 16: z = "F3 Frag grenade";
- case 18: z = "Molotov Burner";
- case 23: z = "USP Silienced";
- case 22: z = "Glock 17";
- case 24: z = "Desert Eagle .50";
- case 25: z = "Benelly M2 Tactical";
- case 27: z = "SPAS-12";
- case 29: z = "HK54";
- case 30: z = "AK-47";
- case 31: z = "Colt M733";
- case 33: z = "Remington 1870";
- case 34: z = "CZ550";
- case 35: z = "RPG-7 Heat";
- case 36: z = "FGM-148 Javelin";
- case 51: z = "(Взорвал)";
- */
- default: GetWeaponName(gun,z,32);
- }
- return z;
- }
- stock DGunDate() // авто удаление оружия через X дней (стоит 7) если их не подобрали. например, в другом моде проверка на удаление происходит в час ночи.
- {
- for(new i = 0; i < MAX_DGUNS; i++)
- {
- if(DGuns[i][g_exist] == 1)
- {
- DGuns[i][g_date]++;
- if(DGuns[i][g_date] > 7) ClearDGun(i);
- }
- }
- }
- stock GetWeaponModel(weaponid) // сделал Double-O-Seven. прям такой сложный код, что нужно оставить копирайты...
- {
- switch(weaponid)
- {
- case 1: return 331;
- case 2..8: return weaponid+331;
- case 9: return 341;
- case 10..15:return weaponid+311;
- case 16..18:return weaponid+326;
- case 22..29:return weaponid+324;
- case 30,31: return weaponid+325;
- case 32: return 372;
- case 33..45:return weaponid+324;
- case 46: return 371;
- }
- return 0;
- }
- stock GetWeaponIDOnSlot(playerid,slot)
- {
- new g, b; GetPlayerWeaponData(playerid, slot, g, b); return g;
- }
- stock RemovePlayerWeapon(playerid, weaponid)
- {
- if(weaponid <= 0 || weaponid > 50) return false;
- new saveweapon[13],saveammo[13];
- for(new slot = 0; slot < 13; slot++) GetPlayerWeaponData(playerid, slot, saveweapon[slot], saveammo[slot]);
- ResetPlayerWeapons(playerid);
- for(new slot; slot < 13; slot++)
- {
- if(saveweapon[slot] == weaponid) continue;
- else GivePlayerWeapon(playerid, saveweapon[slot], saveammo[slot]);
- }
- GivePlayerWeapon(playerid, 0, 1);
- return true;
- }
- public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
- {
- if(dialogid == dialnearguns)
- {
- if(response)
- {
- new nn[16], zz[16], gun, id;
- format(nn,16,"NearGun%d",listitem); format(zz,16,"NearGunId%d",listitem);
- gun = GetPVarInt(playerid, nn); id = GetPVarInt(playerid, zz);
- if(HasSameGun(playerid, gun))
- {
- SetPVarInt(playerid,"TempGun",gun); SetPVarInt(playerid,"TempGunID",id);
- format(ts,256,"{FFFFFF}Вы пытаетесь взять оружие, которое у вас уже есть\n\n\nУ вас есть \n{00FF00}%s{FFFFFF}\n\nВы пытаетесь взять\n{00FF00}%s{FFFFFF}", GetWeaponNameOnSlot(playerid, GetGunSlot(gun)), GetWeaponNameEx(gun));
- return ShowPlayerDialog(playerid, dialsameguns, DIALOG_STYLE_MSGBOX, "Вопрос", ts, "Обменять", "Отмена");
- }
- format(ts,256,"* %s подбирает %s *", GetPlayerNameEx(playerid), GetWeaponNameEx(gun));
- NearMessage(playerid, 0x00FF00FF, 17.5, ts);
- GivePlayerWeapon(playerid, gun, DGuns[id][g_ammo]);
- ClearDGun(id);
- }
- else { /* на ваше усмотрение */ }
- }
- if(dialogid == dialsameguns)
- {
- if(response)
- {
- new gun = GetPVarInt(playerid,"TempGun");
- DropGun(playerid, GetWeaponIDOnSlot(playerid, GetGunSlot(gun) ) );
- format(ts,256,"* %s подбирает %s *", GetPlayerNameEx(playerid), GetWeaponNameEx(gun));
- NearMessage(playerid, 0x00FF00FF, 17.5, ts);
- GivePlayerWeapon(playerid, GetPVarInt(playerid,"TempGun"), DGuns[ GetPVarInt(playerid,"TempGunID") ][g_ammo]);
- ClearDGun(GetPVarInt(playerid,"TempGunID"));
- }
- else NearGuns(playerid);
- }
- return 0;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- DropGun(playerid, GetPlayerWeapon(playerid)); // когда игрог дохнет, он теряет оружие, которое было в руках. можете отключить.
- return 1;
- }
- public OnPlayerText(playerid, text[])
- {
- if(text[0] == 'g' && strlen(text) == 1) // если игрок вводит в консоль символ g, и жмет Enter, оружие выбрасываеться
- {
- DropGun(playerid, GetPlayerWeapon(playerid)); return 0; // можете сделать по другому, например по команде.
- }
- return 1;
- }
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- if(newkeys == 2 && !IsPlayerInAnyVehicle(playerid)) NearGuns(playerid); // по нажатии кнопки "присесть" (2) проверяем,есть ли рядом оружие. можете изменить кнопку.
- return 1;
- }
- // Загрузка из файла
- public LoadDGuns()
- {
- new string[2048], File:file = fopen("guns.ini"); // стандартный путь - scriptfiles/guns.ini, можете изменить
- if(!fexist("guns.ini")) fopen("guns.ini", io_write);
- for(new i = 0; i < MAX_DGUNS; i++)
- {
- fread(file, string); split(string, Split, '|');
- DGuns[i][g_exist] = strval(Split[0]);
- if(DGuns[i][g_exist] == 1)
- {
- DGuns[i][g_gun] = strval(Split[1]); DGuns[i][g_ammo]= strval(Split[2]); DGuns[i][g_date]= strval(Split[3]);
- DGuns[i][g_c][0] = floatstr(Split[4]); DGuns[i][g_c][1] = floatstr(Split[5]); DGuns[i][g_c][2] = floatstr(Split[6]); DGuns[i][g_c][3] = floatstr(Split[7]);
- DGuns[i][g_gid] = CreateDynamicObject(GetWeaponModel(DGuns[i][g_gun]), floatstr(Split[4]), floatstr(Split[5]), floatstr(Split[6]), 90.0, 0.0, floatstr(Split[7]));
- }
- }
- fclose(file);
- }
- stock SaveDGuns() // оохранение
- {
- new File:fileX = fopen("GF/guns.ini", io_write), position[128]; fclose(fileX); fileX = fopen("guns.ini", io_append);
- for(new i = 0; i < MAX_DGUNS; i++)
- {
- format(position,128,"%d|%d|%d|%d|%f|%f|%f|%f|\n",DGuns[i][g_exist], DGuns[i][g_gun],DGuns[i][g_ammo],DGuns[i][g_date],DGuns[i][g_c][0],DGuns[i][g_c][1],DGuns[i][g_c][2],DGuns[i][g_c][3]);fwrite(fileX, position);
- }
- fclose(fileX);
- }
- stock HasSameGun(playerid, gun) // сток определения, есть ли у игрока в инвентаре оружие, которое он хочет взять.
- {
- for(new i = 0; i < 47; i++)
- {
- new gun_2 = GetWData(playerid, i, 3); // берем айди оружия для i
- if(gun_2 == gun) continue; // ...
- if(GetWData(playerid, i, 2) <= 0) continue; // если нету патронов
- switch(gun_2)
- {
- case 02..09: if(gun >= 02 && gun <= 09) return true;
- case 10..15: if(gun >= 10 && gun <= 15) return true;
- case 22..24: if(gun >= 22 && gun <= 24) return true;
- case 25..27: if(gun >= 25 && gun <= 27) return true;
- case 28..29, 32:if(gun == 28 || gun == 29 || gun == 32) return true;
- case 16..18, 39:if(gun >= 16 && gun <= 18 || gun == 39) return true;
- case 35..38: if(gun >= 35 && gun <= 38) return true;
- case 30..31: if(gun == 30 || gun == 31) return true;
- case 33, 34: if(gun == 33 || gun == 34) return true;
- case 41..43: if(gun >= 41 && gun <= 43) return true;
- case 44..46: if(gun >= 44 && gun <= 46) return true;
- }
- }
- return false;
- }
- stock DropGun(playerid, weaponid) // сброс оружия
- {
- if(weaponid == 0) return false;
- new id = -1;
- for(new i = 0; i < MAX_DGUNS; i++)
- {
- if(DGuns[i][g_exist] == 0) { id = i; break; }
- }
- if(id == -1) return false;
- DGuns [id] [g_exist] = 1;
- DGuns [id] [g_gun] = weaponid;
- DGuns [id] [g_ammo] = GetWData(playerid, weaponid, 2);
- DGuns [id] [g_date] = 0;
- new Float:f[4], ang = random(360);
- GetPlayerPos(playerid,f[0],f[1],f[2]); GetXYBehindPlayer(playerid, f[0], f[1], -0.75);
- DGuns[id][g_c][0] = f[0]; DGuns[id][g_c][1] = f[1]; DGuns[id][g_c][2] = f[2] - 0.95; DGuns[id][g_c][3] = ang;
- DGuns[id][g_gid] = CreateDynamicObject(GetWeaponModel(weaponid),f[0], f[1], f[2] - 0.95, 90.0,0.0, ang);
- RemovePlayerWeapon(playerid, weaponid);
- format(ts, 256, "* %s кидает %s на землю *", GetPlayerNameEx(playerid), GetWeaponNameEx(weaponid) );
- NearMessage(playerid, 0xFF0000AA, 15.0, ts);
- SaveDGuns();
- return true;}
- stock ClearDGun(id)
- {
- DGuns[id][g_exist]= 0; DGuns[id][g_gun] = 0; DGuns[id][g_ammo] = 0; DGuns[id][g_date] = 0;
- DGuns[id][g_c][0] = 0; DGuns[id][g_c][1] = 0; DGuns[id][g_c][2] = 0; DGuns[id][g_c][3] = 0;
- DestroyDynamicObject(DGuns[id][g_gid]); SaveDGuns(); return true;
- }
- stock NearGuns(playerid) // проверяем близжайшее оружие от игрока
- {
- new nn[16], bool:id = false;
- for(new wy = 0; wy < 32; wy++) // проверяем Пивары игрока
- {
- format(nn,16,"NearGun%d",wy); // форматируем NN
- SetPVarInt(playerid,nn,0); // она устанавливаеться на ствол
- format(nn,16,"NearGunId%d",wy); // форматируем 2 переменную
- SetPVarInt(playerid,nn,0); // это айди ствола
- }
- for(new i = 0; i < MAX_DGUNS; i++)
- {
- if(DGuns[i][g_exist] == 1 && IsPlayerInRangeOfPoint(playerid,3.5, DGuns[i][g_c][0], DGuns[i][g_c][1], DGuns[i][g_c][2])) // если ствол существует, и мы около него (3.5 м)
- {
- id = true; //ставим проверку, что хоть 1 ствол найден
- for(new wy = 0; wy < 32; wy++) // проверяем пвары игрока
- {
- format(nn,16,"NearGun%d",wy); // форматируем NN
- if(GetPVarInt(playerid,nn) == 0) // если её не существует
- {
- SetPVarInt(playerid,nn,DGuns[i][g_gun]); // она устанавливаеться на ствол
- format(nn,16,"NearGunId%d",wy); // форматируем 2 переменную
- SetPVarInt(playerid,nn,i); // это айди ствола
- wy=33; // прекращаем этот подцикл. можно и break. но одинаковое кол-во символов...
- }
- else continue; // если она существует, уже задана, идем дальше
- }
- }
- }
- if(!id) return false;
- else { ProceedPickupDialog(playerid); SLAP(playerid,0); }
- return true;
- }
- stock ProceedPickupDialog(playerid) // создание диалога о подборе оружия.
- {
- bigone = "";
- new nn[16], zz[16], ss[128];
- for(new i = 0; i < 32; i++)
- {
- format(nn,16,"NearGun%d",i);
- if(GetPVarInt(playerid,nn) > 0)
- {
- format(zz,16,"NearGunId%d",i);
- format(ss,128,"%s - %d ammo\n", GetWeaponNameEx(GetPVarInt(playerid,nn)), DGuns[ GetPVarInt(playerid,zz) ][g_ammo]);
- strins(bigone,ss,strlen(bigone));
- }
- }
- return ShowPlayerDialog(playerid, dialnearguns, DIALOG_STYLE_LIST, "Оружие рядом", bigone, "Взять", "Закрыть");
- }
- // функции
- stock GetXYBehindPlayer(playerid, &Float:x, &Float:y, Float:distance) // определение позиции позади игрока
- {
- new Float:a;
- GetPlayerPos(playerid, x, y, a);
- GetPlayerFacingAngle(playerid, a);
- if(GetPlayerVehicleID(playerid))
- {
- GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
- }
- x += (distance * floatsin(-a+180, degrees));
- y += (distance * floatcos(-a+180, degrees));
- }
- stock GetWeaponNameOnSlot(playerid,slot)
- {
- new g, b, a[128]; GetPlayerWeaponData(playerid, slot, g, b);
- format(a,256,"%s",GetWeaponNameEx(g));
- if(!g) format(a,128,"%s",GetWeaponNameEx(0));
- return a;
- }
- stock GetGunSlot(gun)
- {
- switch(gun)
- {
- case 0,1: return 0;
- case 2..9: return 1;
- 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 16..18,39: return 8;
- case 41..43: return 9;
- case 10..15: return 10;
- case 44..46: return 11;
- case 40: return 12;
- }
- return -1;
- }
- stock split(const strsrc[],strdest[][],delimiter) // известный скрипт написаный непомню кем.
- {
- new i, li, aNum, len;
- while(i <= strlen(strsrc))
- {
- if(strsrc[i] == delimiter || i == strlen(strsrc))
- {
- len = strmid(strdest[aNum],strsrc,li,i,128);
- strdest[aNum][len] = 0;
- li = i+1;
- aNum++;
- }
- i++;
- }
- return 1;
- }
- stock GetWData(playerid, gun, task) //скрипт определения имееться ли у игрока оружие, патроны к нему, и т.д.
- {
- new getw, geta;
- GetPlayerWeaponData(playerid, GetGunSlot(gun), getw, geta);
- if(task == 0) // имеет ли нужное оружие?
- {
- if (geta > 0 && getw == gun) return 1;
- else return 404;
- }
- if(task == 1) RemovePlayerWeapon(playerid, gun); // забрать нужно оружие, помоему бессмысленно...
- if(task == 2) return geta; // возвращает кол-во патронов
- if(task == 3) return getw; // возврашает айди оружия.
- return true;
- }
- stock NearMessage(playerid, color, Float:range, text[])
- {
- new Float:f[3]; GetPlayerPos(playerid, f[0], f[1], f[2]);
- for(new i = 0; i < MAX_PLAYERS; i++)
- {
- if(IsPlayerInRangeOfPoint(i,range, f[0], f[1], f[2]) && GetPlayerInterior(i) == GetPlayerInterior(playerid)) SendClientMessage(i, color, text);
- }
- }
- stock SLAP(playerid,power)
- {
- new Float:x, Float:y, Float:z; GetPlayerPos(playerid,x,y,z); SetPlayerPos(playerid,x,y,z+power);
- }
- stock GetPlayerNameEx(playerid) // определение имени игрока, и убирание нижний прочерков
- {
- new string[24], str[24]; GetPlayerName(playerid,string,24);
- strmid(str,string,0,strlen(string),24);
- for(new i = 0; i < MAX_PLAYER_NAME; i++)
- {
- if (str[i] == '_') str[i] = ' ';
- }
- return str;
- }
Advertisement
Add Comment
Please, Sign In to add comment