Начинающий
- Статус
- Оффлайн
- Регистрация
- 23 Сен 2024
- Сообщения
- 394
- Реакции
- 4
- Выберите загрузчик игры
- Прочие моды
Всем привет, недавно игрался с функцией из чита Nix (noad), а именно "CustomSphereSkin", и как я увидел, скин на сферу получается так:
SS:
Я решил заинтересоваться что вообще значит данный код, и просто ввел его в Goggle, где мне выдался сайт Minecraft Head (noad), на котором есть всякие скины на головы и так далее, пролистав вниз я увидел так называемый раздел "Для разработчиков", в котором как раз таки и находился данный код, который получал скин.
Так вот, я решил сделать мод в котором можно будет вставить любой скин, что довольно круто, так вот, я это сделал (codex), не бейте ногами пожалуйста, вот код:
Также для обновления скина моментально, вам нужно обновить StringComponent (в вашем случае надо будет перенести система обновления текста в ваш код) P.S в коде StringComponent используются утилки Excellent Recode (можете заменить на свои):
Ну вроде все, вот так вот, прикольно и кайфово, а также мемно, думаю зайдет многим
SS:
Так вот, я решил сделать мод в котором можно будет вставить любой скин, что довольно круто, так вот, я это сделал (codex), не бейте ногами пожалуйста, вот код:
module:
package vesence.modules.impl.render;
import com.google.common.eventbus.Subscribe;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.nbt.ListNBT;
import vesence.events.EventUpdate;
import vesence.modules.api.Category;
import vesence.modules.api.Module;
import vesence.modules.api.ModuleInfo;
import vesence.modules.api.impl.ModeSetting;
import vesence.modules.api.impl.StringSetting;
@ModuleInfo(
name = "CustomSphereSkin",
desc = "Позволяет визуально изменить скин головы",
type = Category.Misc
)
public class CustomSphere extends Module {
private static final ModeSetting mode = new ModeSetting(
"Скин сферы",
"Тыква",
"Тыква",
"Скелет",
"Призрак",
"Кастом",
"Стив"
);
public static final StringSetting customCode = new StringSetting(
"Код сайта (Value for Developers)",
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=",
"Код головы"
).setVisible(() -> mode.is("Кастом"));
private static final String PUMPKIN =
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjAzMTM0ZThiMDAxOGExNDYyYmU2NDMwYzJmMTdiM2NlMzVmNzZhM2IwZGFmYWZhNGFkOWM4OWY0NTk5Mjk0YSJ9fX0=";
private static final String SKELETON =
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmJlY2M2NDVmMTI5YzhiYzJmYWE0ZDgxNDU0ODFmYWIxMWFkMmVlNzU3NDlkNjI4ZGNkOTk5YWE5NGU3In19fQ==";
private static final String GHOST =
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGZhMTMwMzJmYTkzOWYxODRkYWE2YTRlMTFlNmYzYTkxM2U0OGYyNTA0OTgxNjVjNTY2NWNjZjQ5YzcyYTE0MCJ9fX0=";
private static final String STEVE =
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmJjZmYwZTNiNzY0ZjFkYzkwNzYxZjIzN2IwZTgwYjQ4ZTU3YzU1NDE5NDgwZmNjNzA2OTVkNzIwZTZjYTI5In19fQ==";
public CustomSphere() {
addSettings(mode, customCode);
}
@Subscribe
private void onUpdate(EventUpdate event) {
if (mc.player == null) {
return;
}
String value = PUMPKIN;
switch ((String) mode.get()) {
case "Скелет":
value = SKELETON;
break;
case "Призрак":
value = GHOST;
break;
case "Кастом":
value = customCode.get();
break;
case "Стив":
value = STEVE;
break;
default:
break;
}
value = value.trim();
if (value.isEmpty()) {
return;
}
for (EquipmentSlotType slot : new EquipmentSlotType[]{EquipmentSlotType.MAINHAND, EquipmentSlotType.OFFHAND, EquipmentSlotType.HEAD}) {
ItemStack stack = mc.player.getItemStackFromSlot(slot);
if (stack.getItem() != Items.PLAYER_HEAD) {
continue;
}
CompoundNBT tag = stack.getOrCreateTag();
CompoundNBT skullOwner = tag.contains("SkullOwner", 10) ? tag.getCompound("SkullOwner") : new CompoundNBT();
CompoundNBT properties = skullOwner.contains("Properties", 10) ? skullOwner.getCompound("Properties") : new CompoundNBT();
ListNBT textures = properties.contains("textures", 9) ? properties.getList("textures", 10) : new ListNBT();
if (textures.isEmpty()) {
textures.add(0, new CompoundNBT());
}
textures.getCompound(0).putString("Value", value);
properties.put("textures", textures);
skullOwner.put("Properties", properties);
tag.put("SkullOwner", skullOwner);
}
}
public static CustomSphere getInstance() {
return Module.getInstance(CustomSphere.class);
}
}
setting:
package vesence.display.clickgui.settings;
import com.mojang.blaze3d.matrix.MatrixStack;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import org.joml.Vector2f;
import org.lwjgl.glfw.GLFW;
import vesence.display.clickgui.ClickGuiScreen;
import vesence.display.clickgui.impl.Components;
import vesence.modules.api.impl.StringSetting;
import vesence.util.math.main.MathUtil;
import vesence.util.visual.components.Cursors;
import vesence.util.visual.components.Scissor;
import vesence.util.visual.components.TextAlign;
import vesence.util.visual.components.TextBox;
import vesence.util.visual.main.color.ColorUtil;
import vesence.util.visual.main.fonts.Fonts;
import vesence.util.visual.main.render.Draw2DRender;
import vesence.util.visual.main.render.Corner;
@FieldDefaults(level = AccessLevel.PRIVATE)
public class StringComponent extends Components {
final StringSetting setting;
final TextBox textBox;
boolean typing;
boolean inputHovered;
public StringComponent(StringSetting setting) {
this.setting = setting;
this.textBox = new TextBox(
new Vector2f(0, 0),
Fonts.SF_MEDIUM,
6f,
ColorUtil.rgba(255, 255, 255, 255),
TextAlign.LEFT,
setting.getDisplayDescription(),
0f,
false,
false
);
this.setHeight(measureHeight());
}
@Override
public float measureHeight() {
return 27;
}
@Override
public void render(MatrixStack stack, float mouseX, float mouseY) {
super.render(stack, mouseX, mouseY);
if (typing) {
ClickGuiScreen.markTextInputActive();
ClickGuiScreen.releaseMovementKeysIfNeeded();
}
if (!typing && !setting.get().equals(textBox.getText())) {
textBox.setText(setting.get());
}
float alpha = (float) (ClickGuiScreen.getRenderAnimationValue());
float rowAlpha = (float) settingsAnim.get() * alpha;
float rowX = getX();
float rowY = getY();
float rowW = getWidth();
float inputX = rowX + 5f;
float inputY = rowY + 9f;
float inputW = rowW - 10f;
float inputH = 11;
Fonts.SF_SEMIBOLD.draw(stack, setting.getDisplayName(), rowX + 6f, rowY - 1f,
ColorUtil.replAlpha(-1, (int) (255 * rowAlpha)), 6.5f, -0.2f);
Draw2DRender.Rounded.smooth(stack, inputX, inputY, inputW, inputH,
ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
Corner.of(2f));
Draw2DRender.Rounded.roundedOutline(stack, inputX, inputY, inputW, inputH, 1f,
ColorUtil.replAlpha(-1, (int) (15 * rowAlpha)),
Corner.of(2f));
textBox.getPosition().set(inputX + 3.5f, inputY + 3);
textBox.setWidth(inputW - 4f);
textBox.setColor(ColorUtil.replAlpha(-1, (int) (255 * alpha)));
textBox.setEmptyText(setting.getDisplayDescription());
textBox.setSelected(typing);
Scissor.push();
Scissor.setFromComponentCoordinates(inputX + 1f, inputY + 1f, inputW - 2f, inputH - 2f);
textBox.draw(stack, rowAlpha);
Scissor.unset();
Scissor.pop();
syncSettingFromTextBox();
boolean hoveredNow = MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH);
if (hoveredNow) {
if (!inputHovered) {
GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.IBEAM);
inputHovered = true;
}
} else if (inputHovered) {
GLFW.glfwSetCursor(Minecraft.getInstance().getMainWindow().getHandle(), Cursors.ARROW);
inputHovered = false;
}
setHeight(measureHeight());
}
private void syncSettingFromTextBox() {
String value = textBox.getText();
if (setting.isOnlyNumber()) {
value = value.replaceAll("[^0-9.-]", "");
}
if (!value.equals(textBox.getText())) {
int cursor = Math.min(textBox.getCursor(), value.length());
textBox.setText(value);
textBox.setCursor(cursor);
}
if (!value.equals(setting.get())) {
setting.set(value);
}
}
@Override
public void charTyped(char codePoint, int modifiers) {
if (typing) {
textBox.charTyped(codePoint);
syncSettingFromTextBox();
}
super.charTyped(codePoint, modifiers);
}
@Override
public void keyPressed(int key, int scanCode, int modifiers) {
if (typing) {
if (key == GLFW.GLFW_KEY_ENTER || key == GLFW.GLFW_KEY_ESCAPE) {
typing = false;
textBox.setSelected(false);
} else {
textBox.keyPressed(key);
syncSettingFromTextBox();
}
}
super.keyPressed(key, scanCode, modifiers);
}
@Override
public boolean mouseClick(float mouseX, float mouseY, int mouse) {
float inputX = getX() + 5f;
float inputY = getY() + 9f;
float inputW = getWidth() - 10f;
float inputH = 8f;
if (MathUtil.isHovered(mouseX, mouseY, inputX, inputY, inputW, inputH) && mouse == 0) {
typing = true;
textBox.setSelected(true);
return true;
} else {
typing = false;
textBox.setSelected(false);
}
return super.mouseClick(mouseX, mouseY, mouse);
}
@Override
public boolean isVisible() {
return setting.visible.get();
}
}
Последнее редактирование: