Exclus1ve | Дата: Суббота, 18.08.2012, 20:20 | Сообщение # 1 |
Освоившийся
Группа:
Продвинутые
Сообщений: 141
Награды: 4
Город: Санкт-Петербург
Репутация: 330
Замечания: 40%
Статус:
| Публикую работу скриптера Games. Сам он тему создать не может, т.к. находится в группе "Пользователи".
Описание от Games:
Всем привет! Возможно вы видели меню аммуниции by OKStyle: http://pawn.ucoz.ru/images/sa-mp-038.png
Я решил попробовать создать такое меню + сделать на кликабельных текстдравах. Ну и конечно, сделать код максимально оптимизированным. Для реализации иконок оружия нужно поместить в папку \models\tхd свой *.tхd файл. И тут сразу возникает вопрос: А что будет, если игроку вывести это меню, если у него в папке с игрой нет необходимого файла?
Ничего... Иконок в этом случае игроку видно не будет, и правильной работы системы тоже не будет. Поэтому нужно отслеживать, есть ли необходимые для работы файлы.
Для этого я решил сделать проверку стандартной функцией GetPlayerVersion + изменить немного samp.dll:)
Ах да, совсем забыл, вот мой скрин меню аммуниции: http://cruelgame.ru/GamesAmmo.png
Видео:
Код системы: Code #include <a_samp>
#define MAX_WEAPONS 6 * 7
new Text:WeaponText[MAX_WEAPONS]; new Text:WeaponIcon[MAX_WEAPONS]; new Text:OtherText[2]; new PlayerVersion[MAX_PLAYERS];
new WeaponNames[][][] = { {"AK-47~n~$5000~n~100", "weapons:30"}, {"Baseball bat~n~$150~n~1", "weapons:5"}, {"Detonator~n~$2000~n~1", "weapons:40"}, {"Brass Knuckles~n~$100~n~1", "weapons:1"}, {"Photo Camera~n~$500~n~1", "weapons:43"}, {"Cane~n~$200~n~1", "weapons:15"}, {"CellPhone~n~$2400~n~1", "weapons:CellPhone"}, {"Chainsaw~n~$500~n~1", "weapons:9"}, {"Shotgun~n~$800~n~70", "weapons:25"}, {"Colt '45~n~$200~n~30", "weapons:22"}, {"Country Rifle~n~$4000~n~50", "weapons:33"}, {"Desert Eagle~n~$1200~n~20", "weapons:24"}, {"Dildo 1~n~$1000~n~1", "weapons:10"}, {"Dildo 2~n~$1000~n~1", "weapons:11"}, {"Extinguisher~n~$200~n~1", "weapons:42"}, {"Flamethrower~n~$150~n~1", "weapons:37"}, {"Flowers~n~$800~n~8", "weapons:14"}, {"Golf Club~n~$10000~n~1", "weapons:2"}, {"Grenade~n~$800~n~8", "weapons:16"}, {"HS Rocket~n~$2400~n~10", "weapons:36"}, {"IR Goggles~n~$2400~n~1", "weapons:45"}, {"JetPack~n~$10000~n~1", "weapons:JetPack"}, {"Katana~n~$150~n~1", "weapons:8"}, {"Knife~n~$400~n~1", "weapons:4"}, {"M4~n~$4000~n~100", "weapons:31"}, {"Micro SMG~n~$2400~n~70", "weapons:28"}, {"Minigun~n~$24000~n~100", "weapons:38"}, {"Molotov~n~$800~n~3", "weapons:18"}, {"MP5~n~$2000~n~300", "weapons:29"}, {"Nightstick~n~$150~n~1", "weapons:3"}, {"Night Vision~n~$2400~n~1", "weapons:44"}, {"Parachute~n~$1000~n~1", "weapons:46"}, {"Pool Cue~n~$200~n~1", "weapons:7"}, {"RPG~n~$24000~n~10", "weapons:35"}, {"Satchel~n~$800~n~8", "weapons:39"}, {"Sawnoff~n~$800~n~30", "weapons:26"}, {"S.P.A.S~n~$2700~n~25", "weapons:27"}, {"Shovel~n~$1000~n~1", "weapons:6"}, {"Silenced~n~$1000~n~15", "weapons:23"}, {"Sniper Rifle~n~$3400~n~50", "weapons:34"}, {"Spraycan~n~$200~n~50", "weapons:41"}, {"Tec-9~n~$500~n~30", "weapons:32"} };
public OnFilterScriptInit() { CreateOtherText(); for(new i, count, calculation; i != MAX_WEAPONS; i++) { if(i % 7 == 0 && i ^ 0) count++; calculation = 30 * (i - (7 * ((54 + (101 * count)) / 101))); CreateWeaponText(i, 54 + (101 * count), 123 + calculation, 114 + (101 * count), WeaponNames[i][0]); CreateWeaponIcon(i, WeaponNames[i][1], 16 + (101 * count), 118 + calculation); } }
public OnPlayerConnect(playerid) { new string[40]; GetPlayerVersion(playerid, string, sizeof(string)); if(!strcmp(string, "0.3e", true)) PlayerVersion[playerid] = 0; else PlayerVersion[playerid] = 1; }
public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp("/ammo", cmdtext, true)) { if(PlayerVersion[playerid] == 0) return SendClientMessage(playerid, -1, "{00ccff}Простите, но у вас не установлены необходимые компоненты!"); for(new i; i != 2; i++) TextDrawShowForPlayer(playerid, OtherText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawShowForPlayer(playerid, WeaponText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawShowForPlayer(playerid, WeaponIcon[i]); SelectTextDraw(playerid, 0xA3B4C5FF); return 1; } return 0; }
public OnPlayerClickTextDraw(playerid, Text:clickedid) { new string[128]; for(new i; i != MAX_WEAPONS; i++) { if(clickedid == WeaponIcon[i]) { format(string, sizeof(string), "{00ccff}Вы нажали на WeaponIcon[%i]", i); SendClientMessage(playerid, -1, string); break; } } if(!(_:clickedid ^ 0xFFFF)) { for(new i; i != 2; i++) TextDrawHideForPlayer(playerid, OtherText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawHideForPlayer(playerid, WeaponText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawHideForPlayer(playerid, WeaponIcon[i]); SendClientMessage(playerid, -1, "{00ccff}Вы нажали ESC."); } }
stock CreateWeaponText(ID, X, Y, Text_X, Text[]) { WeaponText[ID] = TextDrawCreate(X, Y, Text); TextDrawBackgroundColor(WeaponText[ID], 255); TextDrawFont(WeaponText[ID], 1); TextDrawLetterSize(WeaponText[ID], 0.219999, 0.699998); TextDrawColor(WeaponText[ID], -1); TextDrawSetOutline(WeaponText[ID], 1); TextDrawSetProportional(WeaponText[ID], 1); TextDrawUseBox(WeaponText[ID], 1); TextDrawBoxColor(WeaponText[ID], 255); TextDrawTextSize(WeaponText[ID], Text_X, 0.000000); }
stock CreateWeaponIcon(ID, Text[], X, Y) { WeaponIcon[ID] = TextDrawCreate(X, Y, Text); TextDrawBackgroundColor(WeaponIcon[ID], 255); TextDrawFont(WeaponIcon[ID], 4); TextDrawLetterSize(WeaponIcon[ID], 0.500000, 1.000000); TextDrawColor(WeaponIcon[ID], -1); TextDrawSetOutline(WeaponIcon[ID], 0); TextDrawSetProportional(WeaponIcon[ID], 1); TextDrawSetShadow(WeaponIcon[ID], 1); TextDrawUseBox(WeaponIcon[ID], 1); TextDrawBoxColor(WeaponIcon[ID], 255); TextDrawTextSize(WeaponIcon[ID], 31.000000, 27.000000); TextDrawSetSelectable(WeaponIcon[ID], true); }
stock CreateOtherText() { OtherText[0] = TextDrawCreate(631.000000, 110.000000, "~~"); TextDrawBackgroundColor(OtherText[0], 255); TextDrawFont(OtherText[0], 1); TextDrawLetterSize(OtherText[0], 0.500000, 24.499998); TextDrawColor(OtherText[0], -1); TextDrawSetOutline(OtherText[0], 0); TextDrawSetProportional(OtherText[0], 1); TextDrawSetShadow(OtherText[0], 1); TextDrawUseBox(OtherText[0], 1); TextDrawBoxColor(OtherText[0], 910773960); TextDrawTextSize(OtherText[0], 9.000000, 0.000000);
OtherText[1] = TextDrawCreate(220.000000, 110.000000, "Welcome to Ammu-Nation!"); TextDrawBackgroundColor(OtherText[1], 255); TextDrawFont(OtherText[1], 2); TextDrawLetterSize(OtherText[1], 0.339998, 0.899999); TextDrawColor(OtherText[1], -1); TextDrawSetOutline(OtherText[1], 1); TextDrawSetProportional(OtherText[1], 1); }
Теперь давайте хоть немного разберем мой код:
Собственно мозг системы находится здесь:
Code public OnFilterScriptInit() { CreateOtherText(); for(new i, count, calculation; i != MAX_WEAPONS; i++) { if(i % 7 == 0 && i ^ 0) count++; calculation = 30 * (i - (7 * ((54 + (101 * count)) / 101))); CreateWeaponText(i, 54 + (101 * count), 123 + calculation, 114 + (101 * count), WeaponNames[i][0]); CreateWeaponIcon(i, WeaponNames[i][1], 16 + (101 * count), 118 + calculation); } }
Именно эта часть кода рассчитывает позицию каждого создаваемого текстдрава на экране. Если было бы просто создание текстдравов без формул - то этот код занимал бы примерно 1000 строчек.
При коннекте игрока определяется версия клиента. Если версия "0.3e", то переменная PlayerVersion[playerid] принимает значение 0, иначе примет значение 1.
Таким образом, в любой части кода мы может отследить, были ли добавлены в папку с игрой необходимые компоненты для работы системы. Именно это я и сделал при вводе команды /ammo : Code if(PlayerVersion[playerid] == 0) return SendClientMessage(playerid, -1, "{00ccff}Простите, но у вас не установлены необходимые компоненты!");
Заместо сообщения Вы можете например просто вывести меню на диалогах и т.д.
Как вы видите, я сделал поддержку кликабельных текстдравов, т.е. можно нажать на любую иконку оружия:
Code if(clickedid == WeaponIcon[i]) { format(string, sizeof(string), "{00ccff}Вы нажали на WeaponIcon[%i]", i); SendClientMessage(playerid, -1, string); break; }
Саму покупку не делал, думаю, это Вы сможете сделать самостоятельно.
Меню можно и нужно закрывать по нажатию на ESC:
Code if(!(_:clickedid ^ 0xFFFF)) { for(new i; i != 2; i++) TextDrawHideForPlayer(playerid, OtherText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawHideForPlayer(playerid, WeaponText[i]); for(new i; i != MAX_WEAPONS; i++) TextDrawHideForPlayer(playerid, WeaponIcon[i]); SendClientMessage(playerid, -1, "{00ccff}Вы нажали ESC."); }
[/HR] Перейдем к другой части... Поговорим о *.tхd файле. Как я и говорил выше, его нужно поместить в папку /models/tхd. Название моего файла: weapons.tхd
Поэтому, всякий раз, когда я хочу создать спрайт из игры, я должен указывать: weapons:Name
Для удобства я назвал спрайты по ид оружию: http://wiki.sa-mp.com/wiki/Weapons Т.е. например для создания иконки дигла, нужно использовать weapons:24.
Из дополнительных иконок я добавил телефон и JetPack, их иконки создавать так: weapons:CellPhone - телефон weapons:JetPack - JetPack
Кстати, иконки не имеют заднего фона, поэтому их можно использовать на любом фоне:
Ну вроде всё...
Скачать файлы: http://cruelgame.ru/AmmoFiles.rar - weapons.tхd + samp.dll
Софт, который я использовал: Pawno IDA - The Interactive Disassembler TXDWorkShop Paint
node.js
Сообщение отредактировал Exclus1ve - Суббота, 18.08.2012, 20:37 |
|
|
|