Пятница, 29 Ноября 2024, 19:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
[ModLoader] Основы программирования для Minecraft [Часть 1]
EyeДата: Среда, 24 Августа 2011, 19:11 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Всем доброго времени суток!
Перед вами будущий учебник для начинающих модостроителей Minecraft'а.
Намечается написать целых 20 глав для новичков.
Так же скажу от себя - моддинг под данную игру может быть и не очень сложен, но он отнимает много времени и от вас потребуются железные нервы.

АХТУНГ! УЧЕБНИК ПО МОДДИНГУ ДЛЯ MODLOADERA!

Вопрос-ответ:

Вопрос: Чем этот учебник отличается от статей WD'kun'a?
Ответ: В данной учебнике больше информации и моддинг осуществляется для клиента с ModLoader'ом.

Вопрос: А зачем этот ModLoader?
Ответ: Делает удобнее и быстрее моддинг в разы.

Вопрос: Я сделал свой первый мод, куда мне можно его залить и кому показывать?
Ответ: Если вы уверены, что Ваш мод достоин внимания и он хорошо проработан как и в плане оптимизации, так и в плане внешнего вида - скидывайте его на minecraftforum.net

Вопрос: А что если у меня не лицензионная копия игры? Я не смогу делать моды?
Ответ: Моды можно делать и на пиратке, на счет этого не беспокойтесь. Разницы нет.

Вопрос: Я там карочи всие сделол как написана и игра паказывает англиские слава какие та ниче ни понятна!!111
Ответ: Для того, чтобы мы Вам помогли, скиньте Log'и (текст) ошибки прямо в эту тему, мы Вам обязательно поможем!

Вопрос: При рекомпиляции выпадает море ошибок. Что делать?
Ответ: Отписать в эту тему или в джаббер конференцию. Если никто Вам не отвечает, проверьте, все ли скобки стоят правильно и совпадает ли регистр букв.

Вопрос: Я зашел в конференцию, а там никого нет? На форуме не отвечают, в конфе тоже пусто. Вы пропали?
Ответ: Скорее всего из авторов учебника никого нет в сети. Будьте терпеливы, как только появится возможность, мы Вам обязательно поможем!

Вопрос: У меня ничего не получается! Сделайте, пожалуйста за меня ...
Ответ: Мы делаем что-то для пользователей только в крайних случаях, если например ошибки неизлечимы, и все это связанно с вашим компьютером, а не руками.

Вопрос: Я прошел весь учебник, но обновлений не наблюдаю. Вы забросили его?
Ответ: Конечно же нет! Просто у нас тоже есть личная жизнь, и иногда приходится отлучаться.

Вопрос: Я видел у буржуев статью про ... Вы добавите ее к себе?
Ответ: Добавьте ссылку на источник статьи, мы ее прочитаем, проверим, проанализируем и запишем по своему smile

Вопрос: Все время вы говорите создать какой-то файл .java. Как его вообще создать?
Ответ: Создаете текстовый файл и просто переименовываете его из Текстовый документ.txt, например, в mod_gcc.java (открывая его, непосредственно, в нотепаде), а затем редактируете и сохраняете.

Вопрос: В учебнике слишком неудобно отписаны некоторые моменты. Можно я какие мне надо строчки в другие файлики перемещу, ведь так удобнее!
Ответ: Ни в коем случае! И даже не пытайтесь.

Вопрос: А как открыть файл .jar винраром?
Ответ: ПКМ --> Открыть с помощью --> WinRar или 7zip.

Вопрос: Я начал работать, но в src/minecraft/ файлов нет! Я что-то забыл сделать?
Ответ: Скорее всего, декомпилятор выдал ошибку и не отдал вам сорцы игры. Ну или в крайнем случае вы просто забыли его включить.

Глава 1. Подготовка рабочего места и настройка MCP.

Я отказываюсь писать статьи по старому стилю оформления как в прошлых уроках, т.к надоедает все время отписывать числа.
Надеюсь, вы меня поймете B)


Требования:

- Java Development Kit 6 (JDK 6).
- Minecraft Coder Pack (MCP 4.3, самая верхняя).
- Notepad++ - обязательно, иначе вы не сможете пройти главы.
- ModLoader + Клиент (качать обязательно).
- Руки, но не крюки.
- И желательно базовое знание английского языка.

Если что-то не работает - готовый MCP с исходниками 2 глав.

Установка:

1. Создаем папку в любом удобном для вас месте.
2. Копируем файлы архива MCP в эту папку.
3. Прописываем путь к javac.exe (JDK) в системной переменной PATH.
Щелкните правой кнопкой мыши по ярлыку Мой компьютер и выберите категорию Дополнительно. Там же ниже будет кнопка Переменные среды.
В системных переменных найдите переменную Path (PATH) и допишите в ней строки:

Code
;C:\Program Files\Java\jdk1.6.0_25\bin


или

Code
;C:\Program Files\Java\jdk1.6.0_26\bin


В зависимости от версии.

Без пробела и с символом "точка с запятой". Путь укажите, конечно же, по вашему усмотрению системы.



4. Кладем из спец. сборки папки bin и resources в папку jars, которая непосредственно находится в вашей папке которую вы подготовили ранее (о как сказанул Нотч ).
5. Откройте папку bin и найдите minecraft.jar. Откройте (не разархивируйте), и удалите папку META-INF.
6. Запускаем decompile.bat.

7. Как только вы пройдете уроки ниже, просто напросто запускайте recompile.bat, а после чего startclient.bat и тестируйте.
8. Ну а когда вы точно решили что мод готов - запускайте reobf.bat, проходите в папочку reobf и все содержимое кидайте в файл minecraft.jar специально подготовленной для этого игры.

Глава 2. Создание блока.

Запоминайте сразу, в пути \src\minecraft\net\minecraft\src находится весь декомпилированный код игры.

Для начала давайте создадим новый файлик посредством нотепада. Называться он будет mod_gcc.java.
Он служит для складывания всей информации о блоках, рецептах, etc.

Впишем такую строчку (используйте Notepad++, детишки!).

Code
package net.minecraft.src;

Она включает магию которая даст возможность данному файлику работать с Кубокрафтом.
После чего добавим еще две строчечки, но сначала делаем пробел.

Code
public class mod_gcc extends BaseMod
{

Здесь мы создаем класс.

Code
public static Block newblock = new BlockNew(101, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");

Пишем в 5 строке вот такие словечки про наш кубик, тут мы его регистрируем.
Давайте попробуем разобрать данную неразбериху.

Code
public static Block newblock

newblock - это название, точнее регистр блока (не путайте с обычным названием, или консоль ошибок покарает вас!).

Code
new BlockNew(101, 0)

Ну а вот тут у нас как раз и обычное название. Будет использоваться для обозначения в отдельном файлике для блока (доп. характеристики).
Число 101 - айди блока. Используйте с 101 по 250.
Число 0 - не трогайте, это индексация текстуры по terrain.png, оно вообще не понадобится. Пусть стоит в фазе нуля.

Code
setHardness(0.5F)

Тут у нас крепкость указана. На сколько силен блок, так сказать Нотч Вполне реально хватит и 0.5F если это блок похожий на землю (по скорости разрушения).

Code
setResistance(0.3F)

Устойчивость от взрыва. 0.3F отлично вписывается.

Code
setLightValue(1.0F)

Если хотите чтобы ваш блок был светящимся (для дополнительных команд вызова я выведу чуть позже целый спойлер Нотч ), просто укажите это через точку.
1.0F - светится как австралий.

Code
setBlockName("newblock")

Сделан специально чтобы полностью до конца объявить регистр.

Профиряем.



Теперь давайте создадим специальный файлик BlockNew.java (по названию блока) который определит наш кубик в игре.
Вписываем в первую строчку магические буковки, опять.
Code
package net.minecraft.src;


Затем импортируем еще одну магию которая даст нам возможность использовать переменную Random.
Code
import java.util.Random;


Потом создаем публичный класс (не забудьте название).
Code
public class BlockNew extends Block
{


После чего копипастим вот это.
Code
public BlockNew(int i, int j)
                    {
                        super(i, j, Material.ground);
                    }


Тут у нас получается что мы объявляем блок, делаем его настоящим (материальным) и задаем свойство (каждое свойство имеет ряд своих особенностей, типа звуков и т.п).

Дальше объявляем выбрасывание и его ID.
Code
public int idDropped(int i, int j)
                    {
                        return mod_gcc.newblock.blockID;
                    }
                    public int quantityDropped(Random random)
                    {
                            return 1;
                    }
}




Примечание: У меня там Rock написано в свойстве, пропустите это, ага.

Если все так же - переходим к следующей главе.

Глава 2.1. Рецепт для блока или как добыть кубик.

Добавим четыре строчки для определения версии вашего мода.
Code
public String Version()
                        {
                      return "1.7_03";
                        }


Ну а теперь перейдем непосредственно к написанию рецепта.
Запишем вот это:
Code
public mod_gcc()
                        {


И начнем творить.
Регистрируем блок строкой:
Code
ModLoader.RegisterBlock(newblock);


Добавляем название блока в игре.
Code
ModLoader.AddName(newblock, "GCC");


И запюливаем сам рецептик.
Code
ModLoader.AddRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt});


Разберем?

Code
(new ItemStack(newblock, 1)

При крафте появляется newblock в количестве 1 (изменяйте как душе угодно до 64).

Code
new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt

Тут очень сложно объяснить для детей, взрослые может быть и поймут, но я все же попробую.

Одна решетка обозначает одну ячейку сверху вниз (это может быть и верстак, если решеток более 3 в одной строке).
Т.е. в нашем случае мы заполняем обычной землей (Block.dirt) все крафт-ячейки в инвентаре (их 4).

Для примера, если например ваш объект крафтится не только из земли, да еще и в верстаке, поступать нужно так.
Code
new Object[]{ "#X#", "#Z#", "#X#",  Character.valueOf('X'), Block.dirt, Character.valueOf('Z'), Block.sand

В данном примере мы ставим землю по середине в верхней строке, ставим песок по середке в средней строке, и опять землю по середине, но только в третьей строке.
Если какой-то символ (в нашем случае решетка) не указана в Character.valueOf - то значит дефолтно ячейки должны быть пусты.

Проверяем.



Вот и все. Теперь ваш блок можно спокойно скрафтить.
Но мы забыли добавить текстуру, о нет! Об этом читайте в следующей главе.

Глава 2.2. Присваиваем текстуру.

Эта глава очень короткая и легкая, но все же я выделил ей особое место.
Берем вот такую текстуру:


(размеры не изменять!)

И временно кидаем ее в папку jars/bin.

Заходим в папку bin, находим minecraft.jar, открываем ее посредством WinRar или 7-zip и создаем там папочку textures.
И в эту папочку кидаем нашу текстуру java.png.

Теперь открываем mod_gcc.java и добавляем строчки рядом с рецептом.

Code
newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");


Разбираем.

Code
newblock.blockIndexInTexture

Сразу предупреждаю, не забывайте изменять название регистра здесь (у меня частенько бывает такое).

Code
ModLoader.addOverride("/terrain.png"

Не знаю зачем оно, но вроде индексирует размеры блоков внутри terrain.png. Оставляем как есть.

Code
"/textures/java.png"

Ну а тут, непосредственно, указывается путь к текстуре. В нашем случае это java.png в папке textures.

Вот и все!

Проверяем.



Если вы уверены что все сделали правильно, запускайте recompile.bat, проверяйте на наличие ошибок (если есть, отписывайте с вопросами сюда), после чего включайте startclient.bat и наслаждайтесь вашим творением!

Скриншот из игры:



Глава 3. Создание предмета.

Для начала добавим одну строчку:
Code
public static final Item smileItem = new Smile(2000).setItemName("smileItem");


Непосредственно после строки нашего блока:
Code
public static Block newblock = new BlockNew(101, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");


Разберем код предмета.

Code
Item smileItem

Вызываем предмет по тех. названию.

Code
new Smile

Название для будущего Smile.java.

Code
(2000)

ID предмета.

Code
setItemName("smileItem")

Объявляем предмет, даем ему тех. название для идентификации.

Делаем отступ на одну строку от строки:
Code
newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");


И записываем следующее.
Code
ModLoader.AddName(smileItem, "Smile");


Code
(smileItem, "Smile")

Даем название в самой игре.

И последняя строка рецепта.
Code
ModLoader.AddRecipe(new ItemStack(smileItem, 5), new Object[]{ "X#", "#X", Character.valueOf('X'), Block.dirt});


Code
(smileItem, 5)

Число получаемых "смайлов" после крафтинга.

Code
"X#", "#X" Character.valueOf('X'), Block.dirt

Сам рецепт. По диагонали ставим грязь - получаем смайл.

Теперь нам нужно создать файлик Smile.java.

В первой строке как обычно:
Code
package net.minecraft.src;


В третьей и четвертой:
Code
public class Smile extends Item
{


А далее:
Code
   public Smile(int i) {
                super(i);
                maxStackSize = 64;
              }
}


Code
maxStackSize = 64;

Максимальное количество предмета в одном стаке (нап. 64).

Глава 3.1. Присвоение текстуры.

Возьмем текстуру смайлика


(размеры не изменять!)

И поместим ее в minecraft.jar/textures как обычно.

Пишем после рецепта:
Code
smileItem.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/smile.png");


Разбираем.

Code
smileItem.iconIndex

Определяет, чья иконка (текстура).

Code
ModLoader.addOverride("/gui/items.png", "/textures/smile.png")

Это вам уже знакомо. Тут промолчу.

Проверяем.




Теперь вам осталось просто запустить recompile.bat и опробовать смайлы smile

Скриншоты из игры:






Зарезервировано под новости и логи изменений.

Лог изменений от 22 августа:

- Обновлены почти все главы (убран лишний код и прочее).
- Обновлена 12 глава.
- Добавлена рубрика "Вопрос-ответ".

- Добавлена новая мини-глава про прозрачную текстуру.

Лог изменений от 23 августа:

- Обновлена 1 и 8 глава.
- Добавлены новые ответы на вопросы.

Лог изменений от 24 августа:

- Исправил ссылочки и информацию.


ICQ: 422190728,
E-Mail: funnyalien@yandex.ru,
Jabber: funnyalien@jabber.ru,
Steam: funnyalienvalentine,
Twitter: MrFunnyAlien,
Skype: happyconsole,
ВКонтакте: vk.com/twinemen,
Мобильный: +79199212414.


Сообщение отредактировал Eye - Среда, 24 Августа 2011, 19:12
yarickyarickДата: Четверг, 03 Ноября 2011, 02:35 | Сообщение # 2
Маленький лицемер
Сейчас нет на сайте
Code
Copper.Java:14: reached end of file while parsing
}
^


Ошибка!!!
Что делать?
Код:
Code
package net.minecraft.src;
import java.util.Random;
public class Copper extends BaseMod
{
public static Block newblock = new BlockCopper(101, 0).setHardness(2F).setResistance(0F).setBlockName("Copper Ore");
public String Version()
{
return "RPG_MOD v_0.1";
}
public Copper()
{
ModLoader.RegisterBlock(newblock);
ModLoader.AddName(newblock, "Cooper Ore");
newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/CopperOre.png");
}
05142Дата: Четверг, 03 Ноября 2011, 09:40 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
В конце попробуй ещё одну } поставить.

mecinvader
B@rneyДата: Четверг, 03 Ноября 2011, 10:35 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Сам моддингом не занимаюсь, но статья полезная! молодец, продолжай в том же духе happy


Правильного решения порой нет, но лучшее решение есть всегда.
kirix820Дата: Четверг, 03 Ноября 2011, 11:42 | Сообщение # 5
участник
Сейчас нет на сайте
Все было сделано по статье (повторял для версии 1.8.1), recompile.bat ошибок не выдал и все скомпилировал. Клиент при попытке запуска кричит:

Добавлено (03.11.2011, 11:39)
---------------------------------------------
MCP брал 4.4 (для 1.8.1)

Добавлено (03.11.2011, 11:41)
---------------------------------------------
Название класса везде поменял на nbb (проверил. точно везде поменял!)

Добавлено (03.11.2011, 11:42)
---------------------------------------------
ах. все понял. Я сам толком на ошибку не посмотрел. Слот 101 занят. Прошу прощения за беспокойство, вопрос закрыт.




Да будет роцк! Навсегда!
EyeДата: Четверг, 03 Ноября 2011, 11:46 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Я давно здесь не обновлял статью, если хотите почитать обновленную, вот.
Сейчас я только с больницы, и попробую к вечеру все обновить.


ICQ: 422190728,
E-Mail: funnyalien@yandex.ru,
Jabber: funnyalien@jabber.ru,
Steam: funnyalienvalentine,
Twitter: MrFunnyAlien,
Skype: happyconsole,
ВКонтакте: vk.com/twinemen,
Мобильный: +79199212414.
yarickyarickДата: Четверг, 03 Ноября 2011, 16:45 | Сообщение # 7
Маленький лицемер
Сейчас нет на сайте
05142, Пробовал
После этого появляеться ещо 6 ошибок=(

Eye, Жду статьи про создание стражника(воина), враждебного моба и обьекта для крафта в печке=)


Сообщение отредактировал yarickyarick - Четверг, 03 Ноября 2011, 16:45
05142Дата: Четверг, 03 Ноября 2011, 17:24 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
yarickyarick, пиши ошибки сюда, всё правильно, компилятор не будет выдавать эти ошибки если не исправить эту.

mecinvader
yarickyarickДата: Четверг, 03 Ноября 2011, 18:19 | Сообщение # 9
Маленький лицемер
Сейчас нет на сайте
Всем спасибо!
Нашёлся человек который мне помог=)


Сообщение отредактировал yarickyarick - Пятница, 04 Ноября 2011, 16:05
zahar998899Дата: Среда, 16 Ноября 2011, 16:24 | Сообщение # 10
почетный гость
Сейчас нет на сайте
помог спасибо!!!


Minecraft Realistiks
Gameboy_97Дата: Понедельник, 12 Декабря 2011, 20:26 | Сообщение # 11
был не раз
Сейчас нет на сайте
Помогите пожайлуста вот такоей компилятор выдает
Code
== MCP v5.0 ==
> Recompiling client...
"C:\Program Files\Java\jdk1.6.0_25\bin\javac.exe" -g -source 1.6 -target 1.6 -cl
asspath "lib/;lib/*;jars/bin/minecraft.jar;jars/bin/jinput.jar;jars/bin/lwjgl.ja
r;jars/bin/lwjgl_util.jar" -sourcepath src/minecraft -d bin/minecraft src/minecr
aft\net\minecraft\client\*.java src/minecraft\net\minecraft\src\*.java  conf/pat
ches/*.java failed.
Return code : 1

== ERRORS FOUND ==

src\minecraft\net\minecraft\src\BlockNew.java:3: ';' expected
import java.util.Random
^

1 error
==================

> Done in 2.94 seconds
> Recompiling server...
!! Can not find server sources !!
Для продолжения нажмите любую клавишу . . .


By GaMe

Сообщение отредактировал Gameboy_97 - Понедельник, 12 Декабря 2011, 20:30
sk0rpi0nДата: Понедельник, 12 Декабря 2011, 20:52 | Сообщение # 12
Tiberium
Сейчас нет на сайте
Quote (Gameboy_97)
Помогите пожайлуста вот такоей компилятор выдает

Поставь ";" в конце 3-тей строки, и подучи лучше java перед тем, как заниматься моддингом. =)




Adventures of the Purple Ball - готов.
Wanderer - готов.
PoPutДата: Воскресенье, 05 Февраля 2012, 18:10 | Сообщение # 13
был не раз
Сейчас нет на сайте
Помогите урок предназначен для 1.7.3 а у меня 1.0.0 и mcp 5.0 выдает такую ошибку.
Скрин


Жизнь коротка но она того стоит.

В жизни нет муки старашнее любви.

Век живи,век учись.

Я не обычайно не адекватен не смотря на мои сообщения.


Сообщение отредактировал PoPut - Воскресенье, 05 Февраля 2012, 18:12
Spider_SystemДата: Воскресенье, 05 Февраля 2012, 19:08 | Сообщение # 14
Злой прогер-пьяница
Сейчас нет на сайте
PoPut, гогого на minecraft.su

Добавлено (05.02.2012, 19:08)
---------------------------------------------
PoPut, друг, ты до конца просто не дочитал урок. Там это исправится.


Маньяк. Убийца. Социопат. Анархист.
Мой проект:
Spider System
Исходники Spider System
PoPutДата: Воскресенье, 05 Февраля 2012, 19:13 | Сообщение # 15
был не раз
Сейчас нет на сайте
А в чем именно дело.
Просто не понятно в чем дело.
Мне важно не просто скопипастить код.
А именно научиться.
И у меня minecraft.su не грузит
И урок по созданию блока я читал до конца.
Весь код писал вручную.
Но все правильно даже отступы от начала строки.


Жизнь коротка но она того стоит.

В жизни нет муки старашнее любви.

Век живи,век учись.

Я не обычайно не адекватен не смотря на мои сообщения.


Сообщение отредактировал PoPut - Воскресенье, 05 Февраля 2012, 19:15
Spider_SystemДата: Воскресенье, 05 Февраля 2012, 19:14 | Сообщение # 16
Злой прогер-пьяница
Сейчас нет на сайте
PoPut, а я думал его только в КЗ заблочили
Смотри в чем суть: ошибку выдает, потому что функция load() должна быть перезаписана в дочернем от BaseMod классе. То есть там должна быть такая функция. Даже если пустая.


Маньяк. Убийца. Социопат. Анархист.
Мой проект:
Spider System
Исходники Spider System
PoPutДата: Воскресенье, 05 Февраля 2012, 19:19 | Сообщение # 17
был не раз
Сейчас нет на сайте
А на какой строке по счету

Добавлено (05.02.2012, 19:19)
---------------------------------------------

Code
package net.minecraft.src;

public class mod_gcc extends BaseMod
{

  public static Block newblock = new BlockNew(101, 0).setHardness(0.5F).setResistance(1.0F).setBlockName("newblock");

  public String Version()
                          {
                       return "1.7_03";
                         }
   public mod_gcc()

   {

    ModLoader.RegisterBlock(newblock);
    ModLoader.AddName(newblock, "GCC");
    ModLoader.AddRecipe(new ItemStack(newblock, 1), new Object[]{ "##", "##", Character.valueOf('#'), Block.dirt});
    newblock.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/textures/java.png");

   }  

}


Это код mod_gcc
Code
package net.minecraft.src;

import java.util.Random;

public class BlockNew extends Block
{
    
   public BlockNew(int i, int j)
                     {
                         super(i, j, Material.ground);
                     }
  public int idDropped(int i, int j)
                     {
                         return mod_gcc.newblock.blockID;
                     }
     public int quantityDropped(Random random)
                     {
                             return 1;
                     }
}

А это Blocknew


Жизнь коротка но она того стоит.

В жизни нет муки старашнее любви.

Век живи,век учись.

Я не обычайно не адекватен не смотря на мои сообщения.
Spider_SystemДата: Воскресенье, 05 Февраля 2012, 20:44 | Сообщение # 18
Злой прогер-пьяница
Сейчас нет на сайте
PoPut, читай урок.
Вообще говоря, делать класс для каждого блока - бред.


Маньяк. Убийца. Социопат. Анархист.
Мой проект:
Spider System
Исходники Spider System
PoPutДата: Воскресенье, 05 Февраля 2012, 20:55 | Сообщение # 19
был не раз
Сейчас нет на сайте
Уважаемый Spider_System, У меня не грузит minecraft.su а по этому уроку я все сделал как надо.

Жизнь коротка но она того стоит.

В жизни нет муки старашнее любви.

Век живи,век учись.

Я не обычайно не адекватен не смотря на мои сообщения.
Spider_SystemДата: Воскресенье, 05 Февраля 2012, 21:13 | Сообщение # 20
Злой прогер-пьяница
Сейчас нет на сайте
PoPut, до конца?

Маньяк. Убийца. Социопат. Анархист.
Мой проект:
Spider System
Исходники Spider System
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг