Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[INNE][Java] Toggles, WallClimb 'n' High Jump


Gaw3l

Rekomendowane odpowiedzi

Opublikowano

W kolejnej części tego poradnika pokażę Wam, w jaki sposób dodać do swojego cheata/moda tzw. toggles, które pozwalają na włączanie i wyłączanie jego poszczególnych funkcji. Dodatkowo 2 proste funkcje, tj. "spajdermen" - czyli wspinanie się po każdym bloku - oraz high jump, wysoki skok.

 

Toggles!

 

Ale czym one są od technicznego punktu widzenia? Toggle to nic innego, jak prosta zmienna typu boolean (true/false), której wartość będziemy przestawiać w trakcie gry. Na sam początek, wybierzcie miejsce ich zadeklarowania oraz metodę ich zmiany (komenda na czacie, przycisk). Ja z przyzwyczajenia robię to w pliku GuiIngame.java, ale to naprawdę nie ma większego znaczenia.

 

Na początek pod naszymi wszystkimi importami dopisujemy strumień wejścia - klawiatura.

 

Czyli przewijamy na samą górę pliku GuiIngame.java, mniej więcej do tego miejsca:

import java.awt.Color;
import java.util.ArrayList;
import java.util.Random;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;

 

I pod tym właśnie blokiem tekstu dopiszcie linijkę:

import org.lwjgl.input.Keyboard;

 

Następna rzecz: deklaracja zmiennych. Ja tutaj dodam trzy - dla X-Ray'a (poprzedni poradnik), WallClimb oraz High Jump.

 

Pod tymi deklaracjami ...

private static RenderItem itemRenderer = new RenderItem();
private java.util.List chatMessageList;
private Random rand;
private Minecraft mc;
public String field_933_a;
private int updateCounter;
private String recordPlaying;
private int recordPlayingUpFor;
private boolean recordIsPlaying;
public float damageGuiPartialTime;
float prevVignetteBrightness;

 

... dopiszcie:

public static boolean xRay;
public static boolean wallClimb;
public static boolean highJump;

 


 

Pierwsza część za nami. Teraz musimy dopisać zmianę wartości toggle'a oraz same funkcje cheata. Aby to zrobić, najpierw znajdźcie tą część kodu:

drawString(fontrenderer, (new StringBuilder()).append("x: ").append(mc.thePlayer.posX).toString(), 2, 64, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("y: ").append(mc.thePlayer.posY).toString(), 2, 72, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("z: ").append(mc.thePlayer.posZ).toString(), 2, 80, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("f: ").append(MathHelper.floor_double((double)((mc.thePlayer.rotationYaw * 4F) / 360F) + 0.5D) & 3).toString(), 2, 88, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("Seed: ").append(mc.theWorld.getWorldSeed()).toString(), 2, 104, 0xe0e0e0);
		GL11.glPopMatrix();
	}

 

I ją zmodyfikujmy w ten sposób:

drawString(fontrenderer, (new StringBuilder()).append("x: ").append(mc.thePlayer.posX).toString(), 2, 64, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("y: ").append(mc.thePlayer.posY).toString(), 2, 72, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("z: ").append(mc.thePlayer.posZ).toString(), 2, 80, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("f: ").append(MathHelper.floor_double((double)((mc.thePlayer.rotationYaw * 4F) / 360F) + 0.5D) & 3).toString(), 2, 88, 0xe0e0e0);
		drawString(fontrenderer, (new StringBuilder()).append("Seed: ").append(mc.theWorld.getWorldSeed()).toString(), 2, 104, 0xe0e0e0);
		GL11.glPopMatrix();
	} else {
//wkrótce!
}

 

W ten sposób, polecenie zmiany wartości toggle'a będzie przyjmowane tylko wtedy, kiedy if(mc.gameSettings.showDebugInfo) - okno debugowania (bodajże pod F3?) nie będzie włączone. Akutualnie zamiast kodu jest tam tylko komentarz //wkrótce!, ale to się niedługo zmieni.

 


 

A teraz tą część kodu:

} else {
//wkrótce!
}

 

... zastąpcie:

} else {
if(Keyboard.isKeyDown(Keyboard.KEY_Z))
{
xRay = !xRay;
mc.renderGlobal.loadRenderers();
}

if(Keyboard.isKeyDown(Keyboard.KEY_X))
{
wallClimb = !wallClimb;
}

if(Keyboard.isKeyDown(Keyboard.KEY_C))
{
highJump = !highJump;
}
}

 

Jak widzicie, mamy to 3 różne instrukcje if, dla trzech różnych przycisków (Z, X, C - wybrałem te przypadkowo, oczywiście dowolnie można je zmieniać). Za każdym razem, przestawiają one wartość zmiennej na jej odwrotność (zmienna = !zmienna). Teoretycznie dość proste. Ale. Przy przycisku Z, mamy jeszcze dodatkową linijkę mc.renderGlobal.loadRenderers(); Ona jest tam potrzebna, ponieważ w tym wypadku mamy do czynienia z X-Ray'em. Czyli, po zmienianie wartości zmiennej musimy jeszcze wyrenderować od nowa bloki - aby efekt 'skanera' był widoczny.

 


 

Block.java

 

Zakładam, że kod X-Ray'a macie już napisany. Zmodyfikujcie go w następujący sposób:

 

public float getBlockBrightness(IBlockAccess iblockaccess, int i, int j, int k)
	{
if(GuiIngame.xRay)
{
			 return 1000F;
} else {
return iblockaccess.getBrightness(i, j, k, lightValue[blockID]);
}
	}

public int getMixedBrightnessForBlock(IBlockAccess iblockaccess, int i, int j, int k)
	{
if(GuiIngame.xRay)
{
			 return 1000;
} else {
			 return iblockaccess.getLightBrightnessForSkyBlocks(i, j, k, lightValue[blockID]);
}
	}

public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l)
	{
if(GuiIngame.xRay)
{
return blockID == 14 || blockID == 15 || blockID == 16 || blockID == 56 || blockID == 73 || blockID == 74;
} else {
			if(l == 0 && minY > 0.0D)
			{
					return true;
			}
			if(l == 1 && maxY < 1.0D)
			{
					return true;
			}
			if(l == 2 && minZ > 0.0D)
			{
					return true;
			}
			if(l == 3 && maxZ < 1.0D)
			{
					return true;
			}
			if(l == 4 && minX > 0.0D)
			{
					return true;
			}
			if(l == 5 && maxX < 1.0D)
			{
					return true;
			} else
			{
					return !iblockaccess.isBlockOpaqueCube(i, j, k);
			}
}
	}

 

(przepraszam, wcięcia kodu mi się coś pomieszały)

 

Możemy zauważyć prostą zasadę - jeżeli zmienna xRay w GuiIngame ma wartość true, wykonywana jest funkcja cheata. Jeżeli nie - domyślna, oryginalna, napisana przez Notcha (chyba).

 

EntityLiving.java

 

Pora na WallClimb. Szukamy tego kawałka kodu:

public boolean isOnLadder()
{
	int i = MathHelper.floor_double(posX);
	int j = MathHelper.floor_double(boundingBox.minY);
	int k = MathHelper.floor_double(posZ);
	return worldObj.getBlockId(i, j, k) == Block.ladder.blockID;
}

 

Podmieniamy na ten:

public boolean isOnLadder()
{
if(GuiIngame.wallClimb)
return true;
} else {
	int i = MathHelper.floor_double(posX);
	int j = MathHelper.floor_double(boundingBox.minY);
	int k = MathHelper.floor_double(posZ);
	return worldObj.getBlockId(i, j, k) == Block.ladder.blockID;
}
}

 

Jeżeli GuiIngame.wallClimb = true, jesteśmy na drabinie (isOnLadder()) również jest true. Bardzo przydatna opcja - usuwa obrażenia po spadnięciu, działa na serwerach multiplayer prawie zawsze (podczas gdy latanie jest wykrywane - a wtedy kick!).

 

Pora na High Jump. Znów plik EntityLiving.java. Znowu szukamy kawałka kodu:

protected void jump()
{
	motionY = 0.41999998688697815D;

 

... podmieniamy na:

 

protected void jump()
{
if(GuiIngame.highJump)
motionY = 1.2D;
} else {
motionY = 0.41999998688697815D;
}

 

Jeżeli GuiIngame.highJump = true, wysokość skoku wynosi 1.2D - jeżeli nie, 0.41(...)D. Możecie sami wybrać wartość, pamiętajcie tylko o obrażeniach HP (które de facto nie są włączone - do tego potrzebna jest podmiana pakietów, nieco bardziej skomplikowany temat).

 


 

Gotowe. Huh, ale się rozpisałem. D:

recompile.bat -> reobfuscate.bat -> skopiować pliki do minecraft.jar

 

Przepraszam za wszystkie błędy, poradnik pisany 'z palca'. :)

 

Pozdrawiam,

~ Gaw3l.

Opublikowano

Mam problem, mianowicie nie mam w MCP pliku GuiInGame,

a tak poza tym to poradnik wyśmienity.

 

Ale co z tym plikiem?

 

Dobra, wystarczyło przeinstalować MCP, zaraz napisze czy wszystko mi się udało

1325541807-U460344.png

|Member|Pro User|

Opublikowano

Odświeżam gdyż to jeden z najlepszych poradników Gaw3l'a

1325541807-U460344.png

|Member|Pro User|

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...