14:03
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: Alcoholik  
Ammunition [На кликабельных текстдравах] by Games
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
GamesДата: Суббота, 18.08.2012, 20:24 | Сообщение # 2
Новенький
Группа: Продвинутые
Сообщений: 8
Награды: 1
Город: Прим. край
Репутация: 147
Замечания: 0%
Статус:
Во, Exclus1ve, спасибо.
А то сам создать тему в этом разделе не могу :(

zEscДата: Воскресенье, 19.08.2012, 01:47 | Сообщение # 3
Global Elite
Группа: Ангел Хранитель
Сообщений: 896
Награды: 20
Репутация: 856
Замечания: 0%
Статус:
Молодец, дам попозже плюсики


scropionsДата: Воскресенье, 19.08.2012, 03:26 | Сообщение # 4
Новенький
Группа: Пользователи
Сообщений: 25
Награды: 0
Город: Гомель
Репутация: 10
Замечания: 0%
Статус:
позже заберу
hqДата: Понедельник, 20.08.2012, 00:05 | Сообщение # 5
Освоившийся
Группа: Media-ProGroup
Сообщений: 132
Награды: 4
Город: Воронеж
Репутация: 225
Замечания: 0%
Статус:
Отличный скрипт. Удачи тебе)


WINNER_1Дата: Понедельник, 20.08.2012, 17:35 | Сообщение # 6
Новенький
Группа: Пользователи
Награды: 0
Город: SRC
Репутация: 160
Замечания: 20%
Статус:
норм
TOMBRAIDERДата: Суббота, 08.12.2012, 20:27 | Сообщение # 7
Новенький
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Замечания: 0%
Статус:
Ссылка сдохла :(
HawcДата: Суббота, 08.12.2012, 20:36 | Сообщение # 8
Местный
Группа: Publishers
Сообщений: 581
Награды: 10
Город: Санкт-Петербург
Репутация: 773
Замечания: 0%
Статус:
Quote (TOMBRAIDER)
Ссылка сдохла


Смотри на дату создания темы.



TOMBRAIDERДата: Понедельник, 10.12.2012, 23:43 | Сообщение # 9
Новенький
Группа: Пользователи
Сообщений: 3
Награды: 0
Репутация: 0
Замечания: 0%
Статус:
Quote (Hawc)
Смотри на дату создания темы.


Если есть у кого выложите сюда ссылку заранее спасибо.

  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua