Итак,всем привет.Некоторые очень хотят написать хакес на майнкрафт(с модами тем более),но на ру просторах про это нет не слова.Что ж,вы нашли то что нужно.В первом треде мы напишем мод который можно будет поставить на проекты с модами(ебать умно однако),но и это не всё.
Советую не листать иначе вы нихуя не поймете.
Начнем с самого первого вопроса:
На чём будем писать то ебана? - Eclipse IDEA
На какую версию? - 1.7.10(самая оптимальная для модов.не вижу смысла суваться дальше)
Мы обойдем анти чит? - Да.В следуйщем треде(если он будет) обойдем kinetic говно анти чит который сделан для бомже проектов.
Какие функции будут в нашем говне? - WH,KillAura,Fly,Step.
Ладно,приступим.
Step 1: 1-3 хуйня
Качаем JDK.
Step 2:
Качаем ремапнутые сорцы майна(
1.7.10)
Step 3:
Делаем среду разработки.
*Про сетап IDE можно найти всё тут
Step 4: Делаем мейн класс
*Небольшое отступление*
Я вам разжую всё по максимуму.Если и после этого у вас будут вопросы,то лучше не пишите читы пока что..
Итак у нас есть IDE и полностью декомпилированный Minecraft.
И что теперь нам делать с этой информацией?
Заходим в Eclipse и делаем Package(обычно ваш регион(ru).ваш ник(sharlize).Ваш чит(simplecheat).*В java принято имя package писать исключительно в нижнем регистре.у вас не полетят ерроры если будет апперкейс,но всё же лучше не выебыватся*
Создаем класс Main *В java классы называются с апперкейс буквы*
Итак,у нас есть главный класс.Что с ним можно сделать?
Ну например мы хотим зарегестрировать наш хак(я не написал Event класс ибо вы бы нихуя не поняли)
Мы свапаем строку после пакета и пишем
package ru.sharlize.simplecheat;
import cpw.mods.fml.common.Mod;
@Mod(modid = "SimpleCheat", name = "SC", version = "1.0.0")
public class MainC {
}
Что ж,мы сделали наш Mod и теперь Forge видит наш хак.Что дальше то блять?мы делаем *абстрактный главный класс функции от которого в скоре будет наследованы наши другие функции.
*нахуя мне это надо?*
Я не буду затирать про ооп,просто хочу сказать что это будет очень удобно в итоговой реализации.
Итак,вот "структура" нашего чита:
package ru.sharlize.simplecheat;
public abstract class SimpleFunc {
public SimpleFunc(String name, int keybind)
{
this.name = name;
this.keybind = keybind;
}
private boolean active;
private String name;
private int keybind;
public String getName()
{
return name;
}
public int getKeyBind()
{
return keybind;
}
public boolean getActive()
{
return active;
}
public void setToggle()
{
if(active)
{
onDisable();
} else {
onEnable();
}
this.active = !active;
}
public void setStatus(boolean value)
{
this.active = value;
}
public void setKeyBind(int keybind)
{
this.keybind = keybind;
}
/*on Event*/
public void onTick() {}
public void onPreRender() {}
public void onPostRender() {}
public void onDisable() {}
public void onEnable() {}
}
Что же это значит?Пробежимся с самого начала.Если вы не знаете Java хоть чуть чуть(конструктор класса хотя бы),то закрывайте тред и идите учить жабу.Это очень легко и полезно.
В конструкторе класса мы указали типы "String" и "int".Значит у класса наследника(? extends SimpleFunc) должен быть такой же конструктор с такими же параметрами.
В качестве параметра String идет название функции,а int -*Отступление почему int идет как кнопка бинда
В Java есть класс KeyBoard в котором все "кнопки" идут типом int.*
KeyBind нашей функции.
Теперь когда у нас есть Simple функция можно сделать ArrayList(лист с классами функций).
Делаем вот такой вот "код"
public static ArrayList<SimpleFunc> func = new ArrayList<SimpleFunc>();
и пихаем его в главный класс.
Теперь можно вызывать ВСЕ наши функции которые добавлены в лист "func".
Зачем это нам?
Допустим мы хотим вызывать в TickEvent(в тик майна) все наши функции.
Делаем класс с эвентами + проверку на нажатие кнопки *active | noactive.
package ru.sharlize.simplecheat;
import org.lwjgl.input.Keyboard;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import net.minecraft.client.Minecraft;
public class SimpleEvent {
@SubscribeEvent
public void onTick(TickEvent.ClientTickEvent event)
{
if(Minecraft.getMinecraft().thePlayer == null)
{
return;
}
for(SimpleFunc sf : MainC.func)
{
if(sf.getActive())
{
sf.onTick();
}
if(isKeyBindDown(sf.getKeyBind()))
{
if(Minecraft.getMinecraft().currentScreen != null)
{
return;
}
sf.setToggle();
break;
}
}
}
public boolean isKeyBindDown(int key) {
if (Keyboard.isKeyDown(key) != keyStates[key])
{
return keyStates[key] = !keyStates[key];
} else {
return false;
}
}
private boolean keyStates[] = new boolean[256];
@SubscribeEvent
public void onPost(RenderPlayerEvent.Post event)
{
for(SimpleFunc sf : MainC.func)
{
if(sf.getActive())
{
sf.onPostRender();
}
}
}
@SubscribeEvent
public void onPost(RenderPlayerEvent.Pre event)
{
for(SimpleFunc sf : MainC.func)
{
if(sf.getActive())
{
sf.onPreRender();
}
}
}
}
Можете поразбирать код,всё должно быть максимально понятным.
Ну ладно,перейдем к самому сладкому,к функциям.
Первым думаю сделать Step как самое легкое.
Создаем класс *функцию*
package ru.sharlize.simplecheat;
import org.lwjgl.input.Keyboard;
import net.minecraft.client.Minecraft;
public class Step extends SimpleFunc {
public Step()
{
super("Step", Keyboard.KEY_I);
}
}
Оверрайдим метод из супер класса("перехватываем" метод из класса SimpleFunc)
И слушаем внимательно.
Так как нам нужно заменить параметр stepHeight в игроке это нам нужно вызвать всего лишь 1 раз.
@Override
public void onEnable()
{
Minecraft.getMinecraft().thePlayer.stepHeight = 150;
}
@Override
public void onDisable()
{
Minecraft.getMinecraft().thePlayer.stepHeight = 1;
}
*Опять же отступление*
Вообще в майнкрафте очень много чего можно разрыть если интересно.
Для получения всех методов и полей допустим из мира(кроме private,и то java#Reflect и на это хуй ложил) нужно написать
Minecraft.getMinecraft().theWorld
Допустим вам нужно получить всех прогруженных энтити.
Пишите Minecraft.getMinecraft().theWorld.loadedEntityList и все прогруженные энтити у вас в ваших руках в формате пнг(List).
Ладно,вот наша первая функция и готова.
Теперь перейдем к флаю.У флая в майнкрафте очень много реализаций,но я покажу две.
Самая легкая:
package ru.sharlize.simplecheat;
import org.lwjgl.input.Keyboard;
import net.minecraft.client.Minecraft;
public class Fly extends SimpleFunc {
public Fly()
{
super("Fly", Keyboard.KEY_K);
}
@Override
public void onEnable()
{
Minecraft.getMinecraft().thePlayer.capabilities.allowFlying = true;
}
@Override
public void onDisable()
{
Minecraft.getMinecraft().thePlayer.capabilities.allowFlying = false;
}
}
Потруднее это когда нужно сделать обход для проекта.
@Override
public void onTick()
{
if(Minecraft.getMinecraft().gameSettings.keyBindJump.getIsKeyPressed())
{
Minecraft.getMinecraft().thePlayer.motionY =+ 0.05F;
} else {
Minecraft.getMinecraft().thePlayer.motionY =- 0.05F;
}
if(Minecraft.getMinecraft().gameSettings.keyBindSneak.getIsKeyPressed())
{
Minecraft.getMinecraft().thePlayer.motionY =- 0.1F;
}
}
WARNING!!!!
Заметьте,тут мы уже используем onTick,т.к motionY это параметр который будет меняться во время выполнения функции(мы будем менять).
KillAura..Ухх бля как звучит опасно,но на самом деле если не ебаться то 1 строчка кода..Смешно даже как то.
@Override
public void onTick()
{
for (Iterator i = Minecraft.getMinecraft().theWorld.loadedEntityList.iterator(); i.hasNext();) {
Object o = i.next();
if(o instanceof EntityPlayer)
{
EntityPlayer ep = (EntityPlayer) o;
if(!(ep instanceof EntityPlayerSP))
{
Minecraft.getMinecraft().playerController.attackEntity(Minecraft.getMinecraft().thePlayer, ep);
}
}
}
}
Ключевой строчкой,а именно методом станет attackEntity с параметром EntityPlayer(нашего плеера) и Entity(игрока которого хотим ударить).
И последняя функция - вх.
package ru.sharlize.simplecheat;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;
import net.minecraft.client.Minecraft;
public class WallHack extends SimpleFunc {
public WallHack()
{
super("WH", Keyboard.KEY_M);
}
@Override
public void onPostRender()
{
GL11.glDisable(32823);
GL11.glPolygonOffset(1.0F, 1100000.0F);
GL11.glEnable(2896);
}
@Override
public void onPreRender()
{
GL11.glEnable(32823);
GL11.glPolygonOffset(1.0F, -1100000.0F);
GL11.glDisable(2896);
}
}
Тут думаю просто вам нужно почитать про GL11,ибо по другому тут не объяснить.
И наконец легендарная строчка(и) кода в Main классе
@Mod.EventHandler
public void init(FMLInitializationEvent event)
{
MinecraftForge.EVENT_BUS.register(new SimpleEvent());
FMLCommonHandler.instance().bus().register(new SimpleEvent());
addFunc();
}
public void addFunc()
{
func.add(new Fly());
func.add(new WallHack());
func.add(new Step());
func.add(new KillAura());
}
Скачать весь код -
Credits: WendoX
Второго треда скорее всего не будет,а хотя,кто меня знает..