[cleanup] Mixins package (#1824)

This commit is contained in:
liv 2021-01-08 14:58:18 -05:00 committed by GitHub
parent 3b7b5bf36d
commit b23e73968d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 448 additions and 333 deletions

View File

@ -72,12 +72,12 @@ public class MixinMinecraft {
@Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;displayCrashReport(Lnet/minecraft/crash/CrashReport;)V", shift = At.Shift.BEFORE))
public void displayCrashReport(CallbackInfo info) {
save();
Wrapper.saveAndShutdown();
}
@Inject(method = "shutdown", at = @At("HEAD"))
public void shutdown(CallbackInfo info) {
save();
Wrapper.saveAndShutdown();
}
@Inject(method = "init", at = @At("TAIL"))
@ -87,14 +87,5 @@ public class MixinMinecraft {
}
}
private void save() {
if (!KamiMod.isReady()) return;
ShutdownEvent.INSTANCE.post();
System.out.println("Shutting down: saving KAMI configuration");
ConfigUtils.INSTANCE.saveAll();
System.out.println("Configuration saved.");
}
}

View File

@ -26,7 +26,7 @@ public class MixinGuiContainer extends GuiScreen {
public void initGui(CallbackInfo ci) {
if (ChestStealer.INSTANCE.isValidGui()) {
this.buttonList.add(stealButton);
updateButton();
ChestStealer.updateButton(stealButton, this.guiLeft, this.xSize, this.guiTop);
}
}
@ -41,24 +41,7 @@ public class MixinGuiContainer extends GuiScreen {
@Inject(method = "updateScreen", at = @At("HEAD"))
public void updateScreen(CallbackInfo ci) {
updateButton();
ChestStealer.updateButton(stealButton, this.guiLeft, this.xSize, this.guiTop);
}
private void updateButton() {
if (ChestStealer.INSTANCE.isEnabled() && ChestStealer.INSTANCE.isContainerOpen()) {
String str = "";
if (ChestStealer.INSTANCE.getStealing()) {
str = "Stop";
} else {
str = "Steal";
}
stealButton.x = this.guiLeft + this.xSize + 2;
stealButton.y = this.guiTop + 2;
stealButton.enabled = ChestStealer.INSTANCE.canSteal();
stealButton.visible = true;
stealButton.displayString = str;
} else {
stealButton.visible = false;
}
}
}

View File

@ -12,31 +12,21 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable;
public class MixinGuiIngameForge {
@ModifyVariable(method = "renderAir", at = @At(value = "STORE", ordinal = 0))
private EntityPlayer renderAir$getRenderViewEntity(EntityPlayer renderViewEntity) {
return gerRenderViewEntity(renderViewEntity);
return Freecam.getRenderViewEntity(renderViewEntity);
}
@ModifyVariable(method = "renderHealth", at = @At(value = "STORE", ordinal = 0))
private EntityPlayer renderHealth$getRenderViewEntity(EntityPlayer renderViewEntity) {
return gerRenderViewEntity(renderViewEntity);
return Freecam.getRenderViewEntity(renderViewEntity);
}
@ModifyVariable(method = "renderFood", at = @At(value = "STORE", ordinal = 0))
private EntityPlayer renderFood$getRenderViewEntity(EntityPlayer renderViewEntity) {
return gerRenderViewEntity(renderViewEntity);
return Freecam.getRenderViewEntity(renderViewEntity);
}
@ModifyVariable(method = "renderHealthMount", at = @At(value = "STORE", ordinal = 0))
private EntityPlayer renderHealthMount$getRenderViewEntity(EntityPlayer renderViewEntity) {
return gerRenderViewEntity(renderViewEntity);
}
private EntityPlayer gerRenderViewEntity(EntityPlayer renderViewEntity) {
EntityPlayer player = Wrapper.getPlayer();
if (Freecam.INSTANCE.isEnabled() && player != null) {
return player;
} else {
return renderViewEntity;
}
return Freecam.getRenderViewEntity(renderViewEntity);
}
}

View File

@ -32,19 +32,12 @@ public abstract class MixinGuiNewChat {
@Redirect(method = "setChatLine", at = @At(value = "INVOKE", target = "Ljava/util/List;size()I", ordinal = 0, remap = false))
public <E> int drawnChatLinesSize(List<E> list) {
return getModifiedSize(list);
return ExtraChatHistory.getModifiedSize(list);
}
@Redirect(method = "setChatLine", at = @At(value = "INVOKE", target = "Ljava/util/List;size()I", ordinal = 2, remap = false))
public <E> int chatLinesSize(List<E> list) {
return getModifiedSize(list);
return ExtraChatHistory.getModifiedSize(list);
}
public <E> int getModifiedSize(List<E> list) {
if (ExtraChatHistory.INSTANCE.isEnabled()) {
return list.size() - ExtraChatHistory.INSTANCE.getMaxMessages().getValue() - 100;
} else {
return list.size();
}
}
}

View File

@ -21,7 +21,7 @@ public class MixinGuiPlayerTabOverlay {
@Redirect(method = "renderPlayerlist", at = @At(value = "INVOKE", target = "Ljava/util/List;subList(II)Ljava/util/List;", remap = false))
public <E> List<E> subList(List<E> list, int fromIndex, int toIndex) {
return list.subList(fromIndex, ExtraTab.INSTANCE.isEnabled() ? Math.min(ExtraTab.INSTANCE.getTabSize().getValue(), list.size()) : toIndex);
return ExtraTab.INSTANCE.subList(list, fromIndex, toIndex);
}
@Inject(method = "getPlayerName", at = @At("HEAD"), cancellable = true)

View File

@ -3,17 +3,15 @@ package me.zeroeightsix.kami.mixin.client.gui;
import me.zeroeightsix.kami.module.modules.render.CleanGUI;
import me.zeroeightsix.kami.module.modules.render.MapPreview;
import me.zeroeightsix.kami.module.modules.render.ShulkerPreview;
import me.zeroeightsix.kami.util.Wrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.client.renderer.RenderItem;
import net.minecraft.item.ItemMap;
import net.minecraft.item.ItemShulkerBox;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.NonNullList;
import net.minecraft.world.storage.MapData;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -24,140 +22,29 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(GuiScreen.class)
public class MixinGuiScreen {
@Shadow public Minecraft mc;
RenderItem itemRender = Minecraft.getMinecraft().getRenderItem();
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
@Inject(method = "renderToolTip", at = @At("HEAD"), cancellable = true)
public void renderToolTip(ItemStack stack, int x, int y, CallbackInfo info) {
if (ShulkerPreview.INSTANCE.isEnabled() && stack.getItem() instanceof ItemShulkerBox) {
NBTTagCompound tagCompound = stack.getTagCompound();
if (tagCompound != null && tagCompound.hasKey("BlockEntityTag", 10)) {
NBTTagCompound blockEntityTag = tagCompound.getCompoundTag("BlockEntityTag");
if (blockEntityTag.hasKey("Items", 9)) {
// We'll take over!
info.cancel();
NBTTagCompound tagCompound = ShulkerPreview.getShulkerData(stack);
NonNullList<ItemStack> nonnulllist = NonNullList.withSize(27, ItemStack.EMPTY);
ItemStackHelper.loadAllItems(blockEntityTag, nonnulllist);
GlStateManager.enableBlend();
GlStateManager.disableRescaleNormal();
RenderHelper.disableStandardItemLighting();
GlStateManager.disableLighting();
GlStateManager.disableDepth();
int width = Math.max(144, fontRenderer.getStringWidth(stack.getDisplayName()) + 3); //9*16
int x1 = x + 12;
int y1 = y - 12;
int height = 48 + 9; //3*16
this.itemRender.zLevel = 300.0F;
this.drawGradientRectP(x1 - 3, y1 - 4, x1 + width + 3, y1 - 3, -267386864, -267386864);
this.drawGradientRectP(x1 - 3, y1 + height + 3, x1 + width + 3, y1 + height + 4, -267386864, -267386864);
this.drawGradientRectP(x1 - 3, y1 - 3, x1 + width + 3, y1 + height + 3, -267386864, -267386864);
this.drawGradientRectP(x1 - 4, y1 - 3, x1 - 3, y1 + height + 3, -267386864, -267386864);
this.drawGradientRectP(x1 + width + 3, y1 - 3, x1 + width + 4, y1 + height + 3, -267386864, -267386864);
this.drawGradientRectP(x1 - 3, y1 - 3 + 1, x1 - 3 + 1, y1 + height + 3 - 1, 1347420415, 1344798847);
this.drawGradientRectP(x1 + width + 2, y1 - 3 + 1, x1 + width + 3, y1 + height + 3 - 1, 1347420415, 1344798847);
this.drawGradientRectP(x1 - 3, y1 - 3, x1 + width + 3, y1 - 3 + 1, 1347420415, 1347420415);
this.drawGradientRectP(x1 - 3, y1 + height + 2, x1 + width + 3, y1 + height + 3, 1344798847, 1344798847);
fontRenderer.drawString(stack.getDisplayName(), x + 12, y - 12, 0xffffff);
GlStateManager.enableBlend();
GlStateManager.enableAlpha();
GlStateManager.enableTexture2D();
GlStateManager.enableLighting();
GlStateManager.enableDepth();
RenderHelper.enableGUIStandardItemLighting();
for (int i = 0; i < nonnulllist.size(); i++) {
int iX = x + (i % 9) * 16 + 11;
int iY = y + (i / 9) * 16 - 11 + 8;
ItemStack itemStack = nonnulllist.get(i);
itemRender.renderItemAndEffectIntoGUI(itemStack, iX, iY);
itemRender.renderItemOverlayIntoGUI(this.fontRenderer, itemStack, iX, iY, null);
}
RenderHelper.disableStandardItemLighting();
this.itemRender.zLevel = 0.0F;
GlStateManager.enableLighting();
GlStateManager.enableDepth();
RenderHelper.enableStandardItemLighting();
GlStateManager.enableRescaleNormal();
}
if (tagCompound != null) {
info.cancel();
ShulkerPreview.renderShulkerAndItems(stack, x, y, tagCompound);
}
} else if (MapPreview.INSTANCE.isEnabled() && stack.getItem() instanceof ItemMap) {
MapData mapData = MapPreview.getMapData(stack);
if (mapData != null) {
info.cancel();
int translatedX = x + 6;
int translatedY = y + 6;
double scale = MapPreview.INSTANCE.getScale().getValue() / 5.0;
GlStateManager.pushMatrix();
GlStateManager.color(1f, 1f, 1f);
RenderHelper.enableGUIStandardItemLighting();
GlStateManager.disableDepth();
GlStateManager.translate(translatedX, translatedY, 0.0);
GlStateManager.scale(scale, scale, 0.0);
MapPreview.drawMap(stack, mapData);
GlStateManager.enableDepth();
RenderHelper.disableStandardItemLighting();
GlStateManager.popMatrix();
MapPreview.drawMap(stack, mapData, x, y);
}
}
}
/**
* @author cookiedragon234
* see https://github.com/kami-blue/client/pull/293 for discussion
* authors words:
* Also @l1ving you should be more careful with merging commits, especially from people who are new to coding. Stuff like this is obviously stolen, and can get your repository DMCA'd.
* <p>
* as shown be the rest of his discussion, he was fine with it
* I even aknowledged when it was added, after cookies approval, that it was pasted from backdoored.
*/
@Inject(method = "Lnet/minecraft/client/gui/GuiScreen;drawWorldBackground(I)V", at = @At("HEAD"), cancellable = true)
@Inject(method = "drawWorldBackground(I)V", at = @At("HEAD"), cancellable = true)
private void drawWorldBackgroundWrapper(final int tint, final CallbackInfo ci) {
if (this.mc.world != null && CleanGUI.INSTANCE.isEnabled() && (CleanGUI.INSTANCE.getInventoryGlobal().getValue())) {
if (Wrapper.getWorld() != null && CleanGUI.INSTANCE.isEnabled() && (CleanGUI.INSTANCE.getInventoryGlobal().getValue())) {
ci.cancel();
}
}
private void drawGradientRectP(int left, int top, int right, int bottom, int startColor, int endColor) {
float f = (float) (startColor >> 24 & 255) / 255.0F;
float f1 = (float) (startColor >> 16 & 255) / 255.0F;
float f2 = (float) (startColor >> 8 & 255) / 255.0F;
float f3 = (float) (startColor & 255) / 255.0F;
float f4 = (float) (endColor >> 24 & 255) / 255.0F;
float f5 = (float) (endColor >> 16 & 255) / 255.0F;
float f6 = (float) (endColor >> 8 & 255) / 255.0F;
float f7 = (float) (endColor & 255) / 255.0F;
GlStateManager.disableTexture2D();
GlStateManager.enableBlend();
GlStateManager.disableAlpha();
GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
GlStateManager.shadeModel(7425);
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuffer();
bufferbuilder.begin(7, DefaultVertexFormats.POSITION_COLOR);
bufferbuilder.pos(right, top, 300).color(f1, f2, f3, f).endVertex();
bufferbuilder.pos(left, top, 300).color(f1, f2, f3, f).endVertex();
bufferbuilder.pos(left, bottom, 300).color(f5, f6, f7, f4).endVertex();
bufferbuilder.pos(right, bottom, 300).color(f5, f6, f7, f4).endVertex();
tessellator.draw();
GlStateManager.shadeModel(7424);
GlStateManager.disableBlend();
GlStateManager.enableAlpha();
GlStateManager.enableTexture2D();
}
}

View File

@ -70,11 +70,9 @@ public abstract class MixinEntityPlayerSP extends EntityPlayer {
@Inject(method = "displayGUIChest", at = @At("HEAD"), cancellable = true)
public void onDisplayGUIChest(IInventory chestInventory, CallbackInfo ci) {
if (BeaconSelector.INSTANCE.isEnabled()) {
if (chestInventory instanceof IInteractionObject) {
if ("minecraft:beacon".equals(((IInteractionObject) chestInventory).getGuiID())) {
Minecraft.getMinecraft().displayGuiScreen(new KamiGuiBeacon(this.inventory, chestInventory));
ci.cancel();
}
if (chestInventory instanceof IInteractionObject && "minecraft:beacon".equals(((IInteractionObject) chestInventory).getGuiID())) {
Minecraft.getMinecraft().displayGuiScreen(new KamiGuiBeacon(this.inventory, chestInventory));
ci.cancel();
}
}
}

View File

@ -58,20 +58,14 @@ public class MixinEntityRenderer {
@Inject(method = "setupFog", at = @At(value = "HEAD"), cancellable = true)
public void setupFog(int startCoords, float partialTicks, CallbackInfo callbackInfo) {
if (Wrapper.getPlayer() != null
&& Wrapper.getPlayer().ticksExisted > 20
&& AntiFog.INSTANCE.isEnabled()
&& AntiFog.INSTANCE.getMode().getValue() == AntiFog.VisionMode.NO_FOG) {
if (AntiFog.INSTANCE.getShouldNoFog()) {
callbackInfo.cancel();
}
}
@Redirect(method = "setupFog", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ActiveRenderInfo;getBlockStateAtEntityViewpoint(Lnet/minecraft/world/World;Lnet/minecraft/entity/Entity;F)Lnet/minecraft/block/state/IBlockState;"))
public IBlockState getBlockStateAtEntityViewpoint(World worldIn, Entity entityIn, float p_186703_2_) {
if (Wrapper.getPlayer() != null
&& Wrapper.getPlayer().ticksExisted > 20
&& AntiFog.INSTANCE.isEnabled()
&& AntiFog.INSTANCE.getMode().getValue() == AntiFog.VisionMode.AIR) {
if (AntiFog.INSTANCE.getShouldAir()) {
return Blocks.AIR.getDefaultState();
} else {
return ActiveRenderInfo.getBlockStateAtEntityViewpoint(worldIn, entityIn, p_186703_2_);

View File

@ -5,16 +5,9 @@
package me.zeroeightsix.kami.mixin.client.render;
import me.zeroeightsix.kami.manager.managers.KamiMojiManager;
import me.zeroeightsix.kami.module.modules.chat.KamiMoji;
import me.zeroeightsix.kami.util.Wrapper;
import me.zeroeightsix.kami.util.graphics.GlStateUtils;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -22,10 +15,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Arrays;
import static org.lwjgl.opengl.GL11.*;
/**
* Updated by Xiaro on 10/08/20
*/
@ -41,8 +30,6 @@ public abstract class MixinFontRenderer {
@Shadow public float blue;
@Shadow protected abstract void renderStringAtPos(String text, boolean shadow);
@Shadow public abstract int getStringWidth(String s);
@Shadow public abstract int getCharWidth(char character);
/**
* @author Tiger
@ -50,21 +37,9 @@ public abstract class MixinFontRenderer {
@Redirect(method = "renderString", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/FontRenderer;renderStringAtPos(Ljava/lang/String;Z)V"))
private void renderStringAtPos(FontRenderer fontRenderer, String text, boolean shadow) {
if (KamiMoji.INSTANCE.isEnabled() && text.contains(":")) {
int size = FONT_HEIGHT;
for (String possible : text.split(":")) {
if (KamiMojiManager.INSTANCE.isEmoji(possible)) {
String emojiText = ":" + possible + ":";
if (!shadow) {
int index = text.indexOf(emojiText);
if (index == -1) continue;
int x = getStringWidth(text.substring(0, index)) + FONT_HEIGHT / 4;
drawEmoji(KamiMojiManager.INSTANCE.getEmoji(possible), posX + x, posY, size, alpha);
}
text = text.replaceFirst(emojiText, getReplacement());
}
}
text = KamiMoji.getText(text, FONT_HEIGHT, shadow, posX, posY, alpha);
}
GlStateManager.color(red, blue, green, alpha); // Big Mojang meme :monkey:
renderStringAtPos(text, shadow);
}
@ -75,43 +50,7 @@ public abstract class MixinFontRenderer {
@Inject(method = "getStringWidth", at = @At("TAIL"), cancellable = true)
public void getStringWidth(String text, CallbackInfoReturnable<Integer> cir) {
if (cir.getReturnValue() != 0 && KamiMoji.INSTANCE.isEnabled() && text.contains(":")) {
int reducedWidth = cir.getReturnValue();
for (String possible : text.split(":")) {
if (KamiMojiManager.INSTANCE.isEmoji(possible)) {
String emojiText = ":" + possible + ":";
int emojiTextWidth = emojiText.chars().map(i -> getCharWidth((char) i)).sum();
reducedWidth -= emojiTextWidth;
text = text.replaceFirst(emojiText, getReplacement());
}
}
cir.setReturnValue(reducedWidth);
cir.setReturnValue(KamiMoji.getStringWidth(cir.getReturnValue(), text, FONT_HEIGHT));
}
}
/* This is created because vanilla one doesn't take double position input */
private void drawEmoji(ResourceLocation emojiTexture, double x, double y, float size, float alpha) {
if (emojiTexture == null) return;
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuffer();
Wrapper.getMinecraft().getTextureManager().bindTexture(emojiTexture);
GlStateManager.color(1f, 1f, 1f, alpha);
GlStateManager.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
bufferbuilder.pos(x, (y + size), 0.0).tex(0.0, 1.0).endVertex();
bufferbuilder.pos(x + size, y + size, 0.0).tex(1.0, 1.0).endVertex();
bufferbuilder.pos(x + size, y, 0.0).tex(1.0, 0.0).endVertex();
bufferbuilder.pos(x, y, 0.0).tex(0.0, 0.0).endVertex();
tessellator.draw();
GlStateUtils.resetTexParam();
}
private String getReplacement() {
int emojiWidth = (int) Math.ceil((float) FONT_HEIGHT / (float) getCharWidth(' '));
char[] spaces = new char[emojiWidth];
Arrays.fill(spaces, ' ');
return new String(spaces);
}
}

View File

@ -2,6 +2,7 @@ package me.zeroeightsix.kami.mixin.client.render;
import me.zeroeightsix.kami.module.modules.player.Freecam;
import me.zeroeightsix.kami.module.modules.render.ItemModel;
import me.zeroeightsix.kami.util.math.Vec3f;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.ItemRenderer;
@ -25,28 +26,24 @@ public class MixinItemRenderer {
@Inject(method = "renderItemInFirstPerson(Lnet/minecraft/client/entity/AbstractClientPlayer;FFLnet/minecraft/util/EnumHand;FLnet/minecraft/item/ItemStack;F)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/GlStateManager;pushMatrix()V", shift = At.Shift.AFTER))
private void transformSideFirstPerson$pushMatrix(AbstractClientPlayer player, float partialTicks, float pitch, EnumHand hand, float swingProgress, ItemStack stack, float equippedProgress, CallbackInfo ci) {
if (ItemModel.INSTANCE.isEnabled()) {
if (!ItemModel.INSTANCE.getModifyHand() && stack.isEmpty()) return;
EnumHandSide enumhandside = hand == EnumHand.MAIN_HAND ? player.getPrimaryHand() : player.getPrimaryHand().opposite();
float sideMultiplier = enumhandside == EnumHandSide.RIGHT ? 1.0f : -1.0f;
GlStateManager.translate(ItemModel.INSTANCE.getPosX() * sideMultiplier, ItemModel.INSTANCE.getPosY(), ItemModel.INSTANCE.getPosZ());
Vec3f vec = ItemModel.getTranslation(stack, hand, player);
if (vec != null) {
GlStateManager.translate(vec.getX(), vec.getY(), vec.getZ());
}
}
}
@Inject(method = "renderItemInFirstPerson(Lnet/minecraft/client/entity/AbstractClientPlayer;FFLnet/minecraft/util/EnumHand;FLnet/minecraft/item/ItemStack;F)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemRenderer;renderItemSide(Lnet/minecraft/entity/EntityLivingBase;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/renderer/block/model/ItemCameraTransforms$TransformType;Z)V"))
private void transformSideFirstPerson$renderItemSide(AbstractClientPlayer player, float partialTicks, float pitch, EnumHand hand, float swingProgress, ItemStack stack, float equippedProgress, CallbackInfo ci) {
if (ItemModel.INSTANCE.isEnabled()) {
if (!ItemModel.INSTANCE.getModifyHand() && stack.isEmpty()) return;
EnumHandSide enumhandside = hand == EnumHand.MAIN_HAND ? player.getPrimaryHand() : player.getPrimaryHand().opposite();
float sideMultiplier = enumhandside == EnumHandSide.RIGHT ? 1.0f : -1.0f;
float scale = ItemModel.INSTANCE.getScale();
GlStateManager.rotate(ItemModel.INSTANCE.getRotateX(), 1.0f, 0.0f, 0.0f);
GlStateManager.rotate(ItemModel.INSTANCE.getRotateY() * sideMultiplier, 0.0f, 1.0f, 0.0f);
GlStateManager.rotate(ItemModel.INSTANCE.getRotateZ() * sideMultiplier, 0.0f, 0.0f, 1.0f);
GlStateManager.scale(scale, scale, scale);
Vec3f vec = ItemModel.getRotation(stack, hand, player);
if (vec != null) {
float scale = ItemModel.INSTANCE.getScale();
GlStateManager.rotate(vec.getX(), 1.0f, 0.0f, 0.0f);
GlStateManager.rotate(vec.getY(), 0.0f, 1.0f, 0.0f);
GlStateManager.rotate(vec.getZ(), 0.0f, 0.0f, 1.0f);
GlStateManager.scale(scale, scale, scale);
}
}
}
}

View File

@ -28,14 +28,8 @@ public abstract class MixinLayerArmorBase {
@Inject(method = "renderArmorLayer", at = @At("HEAD"), cancellable = true)
public void renderArmorLayerPre(EntityLivingBase entityLivingBaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale, EntityEquipmentSlot slotIn, CallbackInfo ci) {
if (ArmorHide.INSTANCE.isEnabled()) {
if ((ArmorHide.INSTANCE.getPlayer().getValue()) && entityLivingBaseIn instanceof EntityPlayer) {
if (ArmorHide.shouldHidePiece(slotIn)) ci.cancel();
} else if ((ArmorHide.INSTANCE.getArmourStand().getValue()) && entityLivingBaseIn instanceof EntityArmorStand) {
if (ArmorHide.shouldHidePiece(slotIn)) ci.cancel();
} else if ((ArmorHide.INSTANCE.getMobs().getValue()) && entityLivingBaseIn instanceof EntityMob) {
if (ArmorHide.shouldHidePiece(slotIn)) ci.cancel();
}
if (ArmorHide.INSTANCE.isEnabled() && ArmorHide.shouldHide(slotIn, entityLivingBaseIn)) {
ci.cancel();
}
if (!ci.isCancelled()) {

View File

@ -15,29 +15,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import static org.lwjgl.opengl.GL11.GL_QUADS;
/**
* Idea from littlebroto1
*/
@Mixin(MapItemRenderer.class)
public class MixinMapItemRenderer {
private final ResourceLocation kamiMap = new ResourceLocation("kamiblue/kamimap.png");
@Inject(method = "renderMap", at = @At(value = "HEAD"), cancellable = true)
public void renderMap(MapData mapdataIn, boolean noOverlayRendering, CallbackInfo ci) {
if (NoRender.INSTANCE.isEnabled() && NoRender.INSTANCE.getMap().getValue()) {
ci.cancel();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuffer();
Wrapper.getMinecraft().getTextureManager().bindTexture(kamiMap);
bufferbuilder.begin(GL_QUADS, DefaultVertexFormats.POSITION_TEX);
bufferbuilder.pos(0.0D, 128.0D, -0.009999999776482582D).tex(0.0D, 1.0D).endVertex();
bufferbuilder.pos(128.0D, 128.0D, -0.009999999776482582D).tex(1.0D, 1.0D).endVertex();
bufferbuilder.pos(128.0D, 0.0D, -0.009999999776482582D).tex(1.0D, 0.0D).endVertex();
bufferbuilder.pos(0.0D, 0.0D, -0.009999999776482582D).tex(0.0D, 0.0D).endVertex();
tessellator.draw();
NoRender.INSTANCE.renderFakeMap();
}
}
}

View File

@ -51,8 +51,8 @@ abstract class MixinRender<T extends Entity> {
@Inject(method = "renderLivingLabel", at = @At("RETURN"))
protected void renderNamePost(T entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) {
if (ESP.INSTANCE.isEnabled() && ESP.INSTANCE.getDrawingOutline()) {
if (ESP.INSTANCE.getFrameBuffer() != null) ESP.INSTANCE.getFrameBuffer().bindFramebuffer(false);
if (ESP.INSTANCE.isEnabled() && ESP.INSTANCE.getDrawingOutline() && ESP.INSTANCE.getFrameBuffer() != null) {
ESP.INSTANCE.getFrameBuffer().bindFramebuffer(false);
}
if (colorLock) {

View File

@ -44,11 +44,9 @@ public abstract class MixinRenderGlobal {
// Can't use @ModifyVariable here because it crashes outside of a dev env with Optifine
@Redirect(method = "setupTerrain", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;getRenderChunkOffset(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/renderer/chunk/RenderChunk;Lnet/minecraft/util/EnumFacing;)Lnet/minecraft/client/renderer/chunk/RenderChunk;"))
public RenderChunk test(RenderGlobal renderGlobal, BlockPos playerPos, RenderChunk renderChunkBase, EnumFacing facing) {
public RenderChunk renderChunkOffset(RenderGlobal renderGlobal, BlockPos playerPos, RenderChunk renderChunkBase, EnumFacing facing) {
if (Freecam.INSTANCE.isEnabled()) {
playerPos = new BlockPos(MathHelper.floor(mc.player.posX / 16.0D) * 16,
MathHelper.floor(mc.player.posY / 16.0D) * 16,
MathHelper.floor(mc.player.posZ / 16.0D) * 16);
playerPos = Freecam.getRenderChunkOffset();
}
// Can't use a @Shadow of getRenderChunkOffset because it crashes outside of a dev env with Optifine

View File

@ -2,6 +2,7 @@ package me.zeroeightsix.kami.mixin.client.render;
import me.zeroeightsix.kami.module.modules.render.NoRender;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiEditSign;
import net.minecraft.client.renderer.tileentity.TileEntitySignRenderer;
import net.minecraft.tileentity.TileEntitySign;
@ -21,9 +22,9 @@ public class MixinTileEntitySignRenderer {
@Redirect(method = "render", at = @At(value = "FIELD", target = "Lnet/minecraft/tileentity/TileEntitySign;signText:[Lnet/minecraft/util/text/ITextComponent;", opcode = Opcodes.GETFIELD))
public ITextComponent[] getRenderViewEntity(TileEntitySign sign) {
if (NoRender.INSTANCE.isEnabled() && NoRender.INSTANCE.getSignText().getValue()) {
if (mc.currentScreen instanceof GuiEditSign) {
if (getTileSign((GuiEditSign) mc.currentScreen).equals(sign))
return sign.signText;
GuiScreen screen = mc.currentScreen;
if (screen instanceof GuiEditSign && getTileSign((GuiEditSign) screen).equals(sign)) {
return sign.signText;
}
return new ITextComponent[]{};
}

View File

@ -1,6 +1,7 @@
package me.zeroeightsix.kami.module.modules.chat
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.module.modules.chat.ExtraChatHistory.maxMessages
import me.zeroeightsix.kami.setting.ModuleConfig.setting
object ExtraChatHistory : Module(
@ -10,4 +11,13 @@ object ExtraChatHistory : Module(
showOnArray = false
) {
val maxMessages = setting("MaxMessage", 1000, 100..5000, 100)
@JvmStatic
fun <E> getModifiedSize(list: List<E>): Int {
return if (isEnabled) {
list.size - maxMessages.value - 100
} else {
list.size
}
}
}

View File

@ -1,9 +1,84 @@
package me.zeroeightsix.kami.module.modules.chat
import me.zeroeightsix.kami.manager.managers.KamiMojiManager.getEmoji
import me.zeroeightsix.kami.manager.managers.KamiMojiManager.isEmoji
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.util.graphics.GlStateUtils.resetTexParam
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import org.kamiblue.commons.extension.ceilToInt
import org.lwjgl.opengl.GL11
import java.util.*
object KamiMoji : Module(
name = "KamiMoji",
description = "Add emojis to chat using KamiMoji, courtesy of the EmojiAPI.",
category = Category.CHAT
)
) {
@JvmStatic
fun getText(inputText: String, fontHeight: Int, shadow: Boolean, posX: Float, posY: Float, alpha: Float): String {
var text = inputText
for (possible in text.split(":").toTypedArray()) {
if (isEmoji(possible)) {
val emojiText = ":$possible:"
if (!shadow) {
val index = text.indexOf(emojiText)
if (index == -1) continue
val x = mc.fontRenderer.getStringWidth(text.substring(0, index)) + fontHeight / 4
drawEmoji(getEmoji(possible), (posX + x).toDouble(), posY.toDouble(), fontHeight.toFloat(), alpha)
}
text = text.replaceFirst(emojiText.toRegex(), getReplacement(fontHeight))
}
}
return text
}
@JvmStatic
fun getStringWidth(inputWidth: Int, inputText: String, fontHeight: Int): Int {
var text = inputText
var reducedWidth = inputWidth
for (possible in text.split(":")) {
if (isEmoji(possible)) {
val emojiText = ":$possible:"
val emojiTextWidth = emojiText.sumBy { mc.fontRenderer.getCharWidth(it) }
reducedWidth -= emojiTextWidth
text = text.replaceFirst(emojiText, getReplacement(fontHeight))
}
}
return reducedWidth
}
private fun getReplacement(fontHeight: Int): String {
val emojiWidth = (fontHeight / mc.fontRenderer.getCharWidth(' ').toDouble()).ceilToInt()
val spaces = CharArray(emojiWidth) { ' ' }
return String(spaces)
}
/* This is created because vanilla one doesn't take double position input */
private fun drawEmoji(emojiTexture: ResourceLocation?, x: Double, y: Double, size: Float, alpha: Float) {
if (emojiTexture == null) return
val tessellator = Tessellator.getInstance()
val bufBuilder = tessellator.buffer
mc.textureManager.bindTexture(emojiTexture)
GlStateManager.color(1f, 1f, 1f, alpha)
GlStateManager.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR)
bufBuilder.begin(7, DefaultVertexFormats.POSITION_TEX)
bufBuilder.pos(x, y + size, 0.0).tex(0.0, 1.0).endVertex()
bufBuilder.pos(x + size, y + size, 0.0).tex(1.0, 1.0).endVertex()
bufBuilder.pos(x + size, y, 0.0).tex(1.0, 0.0).endVertex()
bufBuilder.pos(x, y, 0.0).tex(0.0, 0.0).endVertex()
tessellator.draw()
resetTexParam()
}
}

View File

@ -1,11 +1,16 @@
package me.zeroeightsix.kami.module.modules.player
import me.zeroeightsix.kami.gui.mc.KamiGuiStealButton
import me.zeroeightsix.kami.mixin.client.gui.MixinGuiContainer
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.module.modules.player.ChestStealer.canSteal
import me.zeroeightsix.kami.module.modules.player.ChestStealer.stealing
import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.InventoryUtils
import me.zeroeightsix.kami.util.InventoryUtils.getEmptySlotContainer
import me.zeroeightsix.kami.util.TickTimer
import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.client.gui.GuiButton
import net.minecraft.client.gui.GuiEnchantment
import net.minecraft.client.gui.GuiMerchant
import net.minecraft.client.gui.GuiRepair
@ -63,6 +68,25 @@ object ChestStealer : Module(
&& mc.currentScreen !is GuiInventory
}
@JvmStatic
fun updateButton(button: GuiButton, left: Int, size: Int, top: Int) {
if (isEnabled && isContainerOpen()) {
val str = if (stealing) {
"Stop"
} else {
"Steal"
}
button.x = left + size + 2
button.y = top + 2
button.enabled = canSteal()
button.visible = true
button.displayString = str
} else {
button.visible = false
}
}
private fun steal(slot: Int?): Boolean {
if (slot == null) return false
val size = getContainerSlotSize()

View File

@ -19,20 +19,19 @@ import net.minecraft.entity.player.EntityPlayer
import net.minecraft.network.play.client.CPacketUseEntity
import net.minecraft.util.MovementInput
import net.minecraft.util.MovementInputFromOptions
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.RayTraceResult
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.event.InputUpdateEvent
import net.minecraftforge.fml.common.gameevent.InputEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.kamiblue.commons.extension.floorToInt
import org.kamiblue.commons.extension.toRadian
import org.kamiblue.commons.interfaces.DisplayEnum
import org.kamiblue.event.listener.listener
import org.lwjgl.input.Keyboard
import org.lwjgl.input.Mouse
import kotlin.math.abs
import kotlin.math.cos
import kotlin.math.min
import kotlin.math.sin
import kotlin.math.*
object Freecam : Module(
name = "Freecam",
@ -126,6 +125,24 @@ object Freecam : Module(
}
}
@JvmStatic
val renderChunkOffset
get() = BlockPos(
(mc.player.posX / 16).floorToInt() * 16,
(mc.player.posY / 16).floorToInt() * 16,
(mc.player.posZ / 16).floorToInt() * 16
)
@JvmStatic
fun getRenderViewEntity(renderViewEntity: EntityPlayer): EntityPlayer {
val player = mc.player
return if (isEnabled && player != null) {
player
} else {
renderViewEntity
}
}
private fun resetMovementInput(movementInput: MovementInput?) {
if (movementInput !is MovementInputFromOptions) return
movementInput.apply {

View File

@ -2,6 +2,7 @@ package me.zeroeightsix.kami.module.modules.render
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.Wrapper.player
/**
* Created by 086 on 9/04/2018.
@ -11,9 +12,17 @@ object AntiFog : Module(
description = "Disables or reduces fog",
category = Category.RENDER
) {
val mode = setting("Mode", VisionMode.NO_FOG)
private val mode by setting("Mode", VisionMode.NO_FOG)
enum class VisionMode {
private enum class VisionMode {
NO_FOG, AIR
}
val shouldNoFog get() = isActive() && mode == VisionMode.NO_FOG
val shouldAir get() = isActive() && mode == VisionMode.AIR
override fun isActive(): Boolean {
return isEnabled && mc.player != null && mc.player.ticksExisted > 20
}
}

View File

@ -2,6 +2,10 @@ package me.zeroeightsix.kami.module.modules.render
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting
import net.minecraft.entity.EntityLivingBase
import net.minecraft.entity.item.EntityArmorStand
import net.minecraft.entity.monster.EntityMob
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.EntityEquipmentSlot
object ArmorHide : Module(
@ -10,19 +14,28 @@ object ArmorHide : Module(
description = "Hides the armor on selected entities",
showOnArray = false
) {
val player = setting("Players", false)
val armourStand = setting("ArmourStands", true)
val mobs = setting("Mobs", true)
private val helmet = setting("Helmet", false)
private val chestplate = setting("Chestplate", false)
private val leggings = setting("Leggings", false)
private val boots = setting("Boots", false)
private val player by setting("Players", false)
private val armorStands by setting("ArmourStands", true)
private val mobs by setting("Mobs", true)
private val helmet by setting("Helmet", false)
private val chestplate by setting("Chestplate", false)
private val leggings by setting("Leggings", false)
private val boots by setting("Boots", false)
@JvmStatic
fun shouldHidePiece(slotIn: EntityEquipmentSlot): Boolean {
return helmet.value && slotIn == EntityEquipmentSlot.HEAD
|| chestplate.value && slotIn == EntityEquipmentSlot.CHEST
|| leggings.value && slotIn == EntityEquipmentSlot.LEGS
|| boots.value && slotIn == EntityEquipmentSlot.FEET
fun shouldHide(slotIn: EntityEquipmentSlot, entity: EntityLivingBase): Boolean {
return when(entity) {
is EntityPlayer -> player && shouldHidePiece(slotIn)
is EntityArmorStand -> armorStands && shouldHidePiece(slotIn)
is EntityMob -> mobs && shouldHidePiece(slotIn)
else -> false
}
}
private fun shouldHidePiece(slotIn: EntityEquipmentSlot): Boolean {
return helmet && slotIn == EntityEquipmentSlot.HEAD
|| chestplate && slotIn == EntityEquipmentSlot.CHEST
|| leggings && slotIn == EntityEquipmentSlot.LEGS
|| boots && slotIn == EntityEquipmentSlot.FEET
}
}

View File

@ -1,6 +1,7 @@
package me.zeroeightsix.kami.module.modules.render
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.module.modules.render.ExtraTab.tabSize
import me.zeroeightsix.kami.setting.ModuleConfig.setting
object ExtraTab : Module(
@ -9,4 +10,8 @@ object ExtraTab : Module(
category = Category.RENDER
) {
val tabSize = setting("MaxPlayers", 265, 80..400, 5)
fun <E> subList(list: List<E>, fromIndex: Int, toIndex: Int): List<E> {
return list.subList(fromIndex, if (isEnabled) tabSize.value.coerceAtMost(list.size) else toIndex)
}
}

View File

@ -2,18 +2,43 @@ package me.zeroeightsix.kami.module.modules.render
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.math.Vec3f
import net.minecraft.client.entity.AbstractClientPlayer
import net.minecraft.item.ItemStack
import net.minecraft.util.EnumHand
import net.minecraft.util.EnumHandSide
object ItemModel : Module(
name = "ItemModel",
description = "Modify hand item rendering in first person",
category = Category.RENDER
) {
val posX by setting("PosX", 0.0f, -5.0f..5.0f, 0.025f)
val posY by setting("PosY", 0.0f, -5.0f..5.0f, 0.025f)
val posZ by setting("PosZ", 0.0f, -5.0f..5.0f, 0.025f)
val rotateX by setting("RotateX", 0.0f, -180.0f..180.0f, 1.0f)
val rotateY by setting("RotateY", 0.0f, -180.0f..180.0f, 1.0f)
val rotateZ by setting("RotateZ", 0.0f, -180.0f..180.0f, 1.0f)
private val posX by setting("PosX", 0.0f, -5.0f..5.0f, 0.025f)
private val posY by setting("PosY", 0.0f, -5.0f..5.0f, 0.025f)
private val posZ by setting("PosZ", 0.0f, -5.0f..5.0f, 0.025f)
private val rotateX by setting("RotateX", 0.0f, -180.0f..180.0f, 1.0f)
private val rotateY by setting("RotateY", 0.0f, -180.0f..180.0f, 1.0f)
private val rotateZ by setting("RotateZ", 0.0f, -180.0f..180.0f, 1.0f)
val scale by setting("Scale", 1.0f, 0.1f..3.0f, 0.025f)
val modifyHand by setting("ModifyHand", false)
private val modifyHand by setting("ModifyHand", false)
@JvmStatic
fun getTranslation(stack: ItemStack, hand: EnumHand, player: AbstractClientPlayer): Vec3f? {
if (!modifyHand && stack.isEmpty) return null
val enumHandSide: EnumHandSide = if (hand == EnumHand.MAIN_HAND) player.primaryHand else player.primaryHand.opposite()
val sideMultiplier = if (enumHandSide == EnumHandSide.RIGHT) 1.0f else -1.0f
return Vec3f(posX * sideMultiplier, posY, posZ)
}
@JvmStatic
fun getRotation(stack: ItemStack, hand: EnumHand, player: AbstractClientPlayer): Vec3f? {
if (!modifyHand && stack.isEmpty) return null
val enumHandSide: EnumHandSide = if (hand == EnumHand.MAIN_HAND) player.primaryHand else player.primaryHand.opposite()
val sideMultiplier = if (enumHandSide == EnumHandSide.RIGHT) 1.0f else -1.0f
return Vec3f(rotateX, rotateY * sideMultiplier, rotateZ * sideMultiplier)
}
}

View File

@ -11,6 +11,8 @@ import me.zeroeightsix.kami.util.graphics.VertexHelper
import me.zeroeightsix.kami.util.graphics.font.FontRenderAdapter.getFontHeight
import me.zeroeightsix.kami.util.graphics.font.FontRenderAdapter.getStringWidth
import me.zeroeightsix.kami.util.math.Vec2d
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.ItemMap
@ -29,8 +31,8 @@ object MapPreview : Module(
) {
private val mapBackground = ResourceLocation("textures/map/map_background.png")
private val showName = setting("ShowName", false)
private val frame = setting("ShowFrame", false)
private val showName = setting("ShowName", true)
private val frame = setting("ShowFrame", true)
val scale = setting("Scale", 5.0, 0.0..10.0, 0.1)
@JvmStatic
@ -39,10 +41,26 @@ object MapPreview : Module(
}
@JvmStatic
fun drawMap(stack: ItemStack, mapData: MapData) {
fun drawMap(stack: ItemStack, mapData: MapData, originalX: Int, originalY: Int) {
val x = originalX + 6.0
val y = originalY + 6.0
val scale = scale.value / 5.0
GlStateManager.pushMatrix()
GlStateManager.color(1f, 1f, 1f)
RenderHelper.enableGUIStandardItemLighting()
GlStateManager.disableDepth()
GlStateManager.translate(x, y, 0.0)
GlStateManager.scale(scale, scale, 0.0)
drawMapFrame()
mc.entityRenderer.mapItemRenderer.renderMap(mapData, false)
drawMapName(stack)
GlStateManager.enableDepth()
RenderHelper.disableStandardItemLighting()
GlStateManager.popMatrix()
}
private fun drawMapFrame() {

View File

@ -6,19 +6,24 @@ import me.zeroeightsix.kami.event.events.PacketEvent
import me.zeroeightsix.kami.event.events.RenderEntityEvent
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.Wrapper.minecraft
import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.block.BlockSnow
import net.minecraft.client.entity.EntityOtherPlayerMP
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.entity.item.*
import net.minecraft.entity.monster.EntityMob
import net.minecraft.entity.passive.IAnimals
import net.minecraft.init.Blocks
import net.minecraft.network.play.server.*
import net.minecraft.tileentity.*
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos
import net.minecraftforge.fml.common.gameevent.TickEvent
import net.minecraftforge.registries.GameData
import org.kamiblue.event.listener.listener
import org.lwjgl.opengl.GL11
object NoRender : Module(
name = "NoRender",
@ -61,6 +66,8 @@ object NoRender : Module(
OTHER, ENTITIES
}
private val kamiMap = ResourceLocation("kamiblue/kamimap.png")
private val settingMap = mapOf(
player to EntityOtherPlayerMP::class.java,
xp to EntityXPOrb::class.java,
@ -148,6 +155,20 @@ object NoRender : Module(
}
}
fun renderFakeMap() {
val tessellator = Tessellator.getInstance()
val bufBuilder = tessellator.buffer
minecraft.textureManager.bindTexture(kamiMap)
bufBuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX)
bufBuilder.pos(0.0, 128.0, -0.009999999776482582).tex(0.0, 1.0).endVertex()
bufBuilder.pos(128.0, 128.0, -0.009999999776482582).tex(1.0, 1.0).endVertex()
bufBuilder.pos(128.0, 0.0, -0.009999999776482582).tex(1.0, 0.0).endVertex()
bufBuilder.pos(0.0, 0.0, -0.009999999776482582).tex(0.0, 0.0).endVertex()
tessellator.draw()
}
private fun updateList() {
entityList = HashSet<Class<*>>().apply {
settingMap.forEach {

View File

@ -2,6 +2,16 @@ package me.zeroeightsix.kami.module.modules.render
import me.zeroeightsix.kami.mixin.client.gui.MixinGuiScreen
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.util.color.ColorConverter
import me.zeroeightsix.kami.util.color.ColorHolder
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.*
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.inventory.ItemStackHelper
import net.minecraft.item.ItemShulkerBox
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.NonNullList
/**
* @see MixinGuiScreen.renderToolTip
@ -10,4 +20,126 @@ object ShulkerPreview : Module(
name = "ShulkerPreview",
category = Category.RENDER,
description = "Previews shulkers in the game GUI"
)
) {
private val itemRenderer = Minecraft.getMinecraft().renderItem
private val fontRenderer = Minecraft.getMinecraft().fontRenderer
@JvmStatic
fun renderShulkerAndItems(stack: ItemStack, originalX: Int, originalY: Int, tagCompound: NBTTagCompound) {
val shulkerInventory = NonNullList.withSize(27, ItemStack.EMPTY)
ItemStackHelper.loadAllItems(tagCompound, shulkerInventory)
GlStateManager.enableBlend()
GlStateManager.disableRescaleNormal()
RenderHelper.disableStandardItemLighting()
GlStateManager.disableLighting()
GlStateManager.disableDepth()
renderShulker(stack, originalX, originalY)
GlStateManager.enableBlend()
GlStateManager.enableAlpha()
GlStateManager.enableTexture2D()
GlStateManager.enableLighting()
GlStateManager.enableDepth()
RenderHelper.enableGUIStandardItemLighting()
renderShulkerItems(shulkerInventory, originalX, originalY)
RenderHelper.disableStandardItemLighting()
itemRenderer.zLevel = 0.0f
GlStateManager.enableLighting()
GlStateManager.enableDepth()
RenderHelper.enableStandardItemLighting()
GlStateManager.enableRescaleNormal()
}
@JvmStatic
fun getShulkerData(stack: ItemStack): NBTTagCompound? {
val tagCompound = if (stack.item is ItemShulkerBox) stack.tagCompound else return null
if (tagCompound != null && tagCompound.hasKey("BlockEntityTag", 10)) {
val blockEntityTag = tagCompound.getCompoundTag("BlockEntityTag")
if (blockEntityTag.hasKey("Items", 9)) {
return blockEntityTag
}
}
return null
}
private fun renderShulker(stack: ItemStack, originalX: Int, originalY: Int) {
val width = 144.coerceAtLeast(fontRenderer.getStringWidth(stack.displayName) + 3) // 9 * 16
val x = originalX + 12
val y = originalY - 12
val height = 48 + 9 // 3 * 16
itemRenderer.zLevel = 300.0f
// Magic numbers taken from Minecraft code
drawGradientRect(x - 3, y - 4, x + width + 3, y - 3, -267386864, -267386864)
drawGradientRect(x - 3, y + height + 3, x + width + 3, y + height + 4, -267386864, -267386864)
drawGradientRect(x - 3, y - 3, x + width + 3, y + height + 3, -267386864, -267386864)
drawGradientRect(x - 4, y - 3, x - 3, y + height + 3, -267386864, -267386864)
drawGradientRect(x + width + 3, y - 3, x + width + 4, y + height + 3, -267386864, -267386864)
drawGradientRect(x - 3, y - 3 + 1, x - 3 + 1, y + height + 3 - 1, 1347420415, 1344798847)
drawGradientRect(x + width + 2, y - 3 + 1, x + width + 3, y + height + 3 - 1, 1347420415, 1344798847)
drawGradientRect(x - 3, y - 3, x + width + 3, y - 3 + 1, 1347420415, 1347420415)
drawGradientRect(x - 3, y + height + 2, x + width + 3, y + height + 3, 1344798847, 1344798847)
fontRenderer.drawString(stack.displayName, x, y, 0xffffff)
}
private fun renderShulkerItems(shulkerInventory: NonNullList<ItemStack>, originalX: Int, originalY: Int) {
for (i in 0 until shulkerInventory.size) {
val x = originalX + i % 9 * 16 + 11
val y = originalY + i / 9 * 16 - 11 + 8
val itemStack: ItemStack = shulkerInventory[i]
itemRenderer.renderItemAndEffectIntoGUI(itemStack, x, y)
itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, itemStack, x, y, null)
}
}
private fun drawGradientRect(left: Int, top: Int, right: Int, bottom: Int, startColor: Int, endColor: Int) {
GlStateManager.disableTexture2D()
GlStateManager.enableBlend()
GlStateManager.disableAlpha()
GlStateManager.tryBlendFuncSeparate(
GlStateManager.SourceFactor.SRC_ALPHA,
GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA,
GlStateManager.SourceFactor.ONE,
GlStateManager.DestFactor.ZERO
)
GlStateManager.shadeModel(7425)
val tessellator = Tessellator.getInstance()
val bufBuilder = tessellator.buffer
bufBuilder.begin(7, DefaultVertexFormats.POSITION_COLOR)
bufBuilder.colorVertex(right, top, startColor)
bufBuilder.colorVertex(left, top, startColor)
bufBuilder.colorVertex(left, bottom, endColor)
bufBuilder.colorVertex(right, bottom, endColor)
tessellator.draw()
GlStateManager.shadeModel(7424)
GlStateManager.disableBlend()
GlStateManager.enableAlpha()
GlStateManager.enableTexture2D()
}
private fun BufferBuilder.colorVertex(x: Int, y: Int, color: Int) {
this.pos(x.toDouble(), y.toDouble(), 300.0)
.color(
(color shr 16 and 255) / 255f,
(color shr 8 and 255) / 255f,
(color and 255) / 255f,
(color shr 24 and 255) / 255f
)
.endVertex()
}
}

View File

@ -1,5 +1,8 @@
package me.zeroeightsix.kami.util
import me.zeroeightsix.kami.KamiMod
import me.zeroeightsix.kami.event.events.ShutdownEvent
import me.zeroeightsix.kami.util.ConfigUtils.saveAll
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityPlayerSP
import net.minecraft.client.multiplayer.WorldClient
@ -16,4 +19,15 @@ object Wrapper {
@JvmStatic
val world: WorldClient?
get() = minecraft.world
@JvmStatic
fun saveAndShutdown() {
if (!KamiMod.isReady()) return
ShutdownEvent.post()
println("Shutting down: saving KAMI configuration")
saveAll()
println("Configuration saved.")
}
}

View File

@ -0,0 +1,3 @@
package me.zeroeightsix.kami.util.math
class Vec3f(val x: Float, val y: Float, val z: Float)