Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Individual Nametags configuration for each EntityType #4355

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public DefaultSettingsWidgetFactory(GuiTheme theme) {
factories.put(StorageBlockListSetting.class, (table, setting) -> storageBlockListW(table, (StorageBlockListSetting) setting));
factories.put(ScreenHandlerListSetting.class, (table, setting) -> screenHandlerListW(table, (ScreenHandlerListSetting) setting));
factories.put(BlockDataSetting.class, (table, setting) -> blockDataW(table, (BlockDataSetting<?>) setting));
factories.put(EntityTypeDataSetting.class, (table, setting) -> entityTypeDataW(table, (EntityTypeDataSetting<?>) setting));
factories.put(PotionSetting.class, (table, setting) -> potionW(table, (PotionSetting) setting));
factories.put(StringListSetting.class, (table, setting) -> stringListW(table, (StringListSetting) setting));
factories.put(BlockPosSetting.class, (table, setting) -> blockPosW(table, (BlockPosSetting) setting));
Expand Down Expand Up @@ -216,7 +217,7 @@ private void providedStringW(WTable table, ProvidedStringSetting setting) {
}

private void genericW(WTable table, GenericSetting<?> setting) {
WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget();
WButton edit = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget();
edit.action = () -> mc.setScreen(setting.get().createScreen(theme));

reset(table, setting, null);
Expand Down Expand Up @@ -341,6 +342,13 @@ private void blockDataW(WTable table, BlockDataSetting<?> setting) {
reset(table, setting, null);
}

private void entityTypeDataW(WTable table, EntityTypeDataSetting<?> setting) {
WButton button = table.add(theme.button(GuiRenderer.EDIT)).expandCellX().widget();
button.action = () -> mc.setScreen(new EntityTypeDataSettingScreen(theme, setting));

reset(table, setting, null);
}

private void potionW(WTable table, PotionSetting setting) {
WHorizontalList list = table.add(theme.horizontalList()).expandX().widget();
WItemWithLabel item = list.add(theme.itemWithLabel(setting.get().potion, setting.get().potion.getName().getString())).widget();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.gui.screens.settings;

import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.WindowScreen;
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
import meteordevelopment.meteorclient.gui.widgets.input.WTextBox;
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
import meteordevelopment.meteorclient.settings.EntityTypeDataSetting;
import meteordevelopment.meteorclient.settings.IEntityTypeData;
import meteordevelopment.meteorclient.utils.misc.IChangeable;
import meteordevelopment.meteorclient.utils.misc.ICopyable;
import meteordevelopment.meteorclient.utils.misc.ISerializable;
import meteordevelopment.meteorclient.utils.misc.Names;
import net.minecraft.entity.EntityType;
import net.minecraft.registry.Registries;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

import static meteordevelopment.meteorclient.MeteorClient.mc;

public class EntityTypeDataSettingScreen extends WindowScreen {
private final List<EntityType> ENTITY_TYPES = new ArrayList<>(100);

private final EntityTypeDataSetting<?> setting;

private WTable table;
private String filterText = "";

public EntityTypeDataSettingScreen(GuiTheme theme, EntityTypeDataSetting<?> setting) {
super(theme, "Configure Entity Types");

this.setting = setting;
}

@Override
public void initWidgets() {
WTextBox filter = add(theme.textBox("")).minWidth(400).expandX().widget();
filter.setFocused(true);
filter.action = () -> {
filterText = filter.get().trim();

table.clear();
initTable();
};

table = add(theme.table()).expandX().widget();

initTable();
}

public <T extends ICopyable<T> & ISerializable<T> & IChangeable & IEntityTypeData<T>> void initTable() {
for (EntityType entityType : Registries.ENTITY_TYPE) {
T entityTypeData = (T) setting.get().get(entityType);

if (entityTypeData != null) ENTITY_TYPES.add(0, entityType);
else ENTITY_TYPES.add(entityType);
}

for (EntityType entityType : ENTITY_TYPES) {
String name = Names.get(entityType);
if (!StringUtils.containsIgnoreCase(name, filterText)) continue;

T entityTypeData = (T) setting.get().get(entityType);

table.add(theme.label(name)).expandCellX();
table.add(theme.label(entityTypeData != null && entityTypeData.isChanged() ? "*": " "));

WButton edit = table.add(theme.button(GuiRenderer.EDIT)).widget();
edit.action = () -> {
T data = entityTypeData;
if (data == null) data = (T) setting.defaultData.get().copy();

mc.setScreen(data.createScreen(theme, entityType, (EntityTypeDataSetting<T>) setting));
};

WButton reset = table.add(theme.button(GuiRenderer.RESET)).widget();
reset.action = () -> {
setting.get().remove(entityType);
setting.onChanged();

if (entityTypeData != null && entityTypeData.isChanged()) {
table.clear();
initTable();
}
};

table.row();
}

ENTITY_TYPES.clear();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import meteordevelopment.meteorclient.mixininterface.IEntityRenderer;
import meteordevelopment.meteorclient.systems.modules.Modules;
import meteordevelopment.meteorclient.systems.modules.render.Fullbright;
import meteordevelopment.meteorclient.systems.modules.render.Nametags;
import meteordevelopment.meteorclient.systems.modules.render.nametags.Nametags;
import meteordevelopment.meteorclient.systems.modules.render.NoRender;
import meteordevelopment.meteorclient.utils.entity.EntityUtils;
import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.settings;

import meteordevelopment.meteorclient.utils.misc.IChangeable;
import meteordevelopment.meteorclient.utils.misc.ICopyable;
import meteordevelopment.meteorclient.utils.misc.IGetter;
import meteordevelopment.meteorclient.utils.misc.ISerializable;
import net.minecraft.entity.EntityType;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

public class EntityTypeDataSetting<T extends ICopyable<T> & ISerializable<T> & IChangeable & IEntityTypeData<T>> extends Setting<Map<EntityType, T>> {
public final IGetter<T> defaultData;

public EntityTypeDataSetting(String name, String description, Map<EntityType, T> defaultValue, Consumer<Map<EntityType, T>> onChanged, Consumer<Setting<Map<EntityType, T>>> onModuleActivated, IGetter<T> defaultData, IVisible visible) {
super(name, description, defaultValue, onChanged, onModuleActivated, visible);

this.defaultData = defaultData;
}

@Override
public void resetImpl() {
value = new HashMap<>(defaultValue);
}

@Override
protected Map<EntityType, T> parseImpl(String str) {
return new HashMap<>(0);
}

@Override
protected boolean isValueValid(Map<EntityType, T> value) {
return true;
}

@Override
protected NbtCompound save(NbtCompound tag) {
NbtCompound valueTag = new NbtCompound();
for (EntityType entityType : get().keySet()) {
valueTag.put(Registries.ENTITY_TYPE.getId(entityType).toString(), get().get(entityType).toTag());
}
tag.put("value", valueTag);

return tag;
}

@Override
protected Map<EntityType, T> load(NbtCompound tag) {
get().clear();

NbtCompound valueTag = tag.getCompound("value");
for (String key : valueTag.getKeys()) {
get().put(Registries.ENTITY_TYPE.get(new Identifier(key)), defaultData.get().copy().fromTag(valueTag.getCompound(key)));
}

return get();
}

public static class Builder<T extends ICopyable<T> & ISerializable<T> & IChangeable & IEntityTypeData<T>> extends SettingBuilder<Builder<T>, Map<EntityType, T>, EntityTypeDataSetting<T>> {
private IGetter<T> defaultData;

public Builder() {
super(new HashMap<>(0));
}

public Builder<T> defaultData(IGetter<T> defaultData) {
this.defaultData = defaultData;
return this;
}

@Override
public EntityTypeDataSetting<T> build() {
return new EntityTypeDataSetting<>(name, description, defaultValue, onChanged, onModuleActivated, defaultData, visible);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.settings;

import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.WidgetScreen;
import meteordevelopment.meteorclient.utils.misc.IChangeable;
import meteordevelopment.meteorclient.utils.misc.ICopyable;
import meteordevelopment.meteorclient.utils.misc.ISerializable;
import net.minecraft.entity.EntityType;

public interface IEntityTypeData<T extends ICopyable<T> & ISerializable<T> & IChangeable & IEntityTypeData<T>> {
WidgetScreen createScreen(GuiTheme theme, EntityType entityType, EntityTypeDataSetting<T> setting);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import meteordevelopment.meteorclient.systems.modules.render.*;
import meteordevelopment.meteorclient.systems.modules.render.blockesp.BlockESP;
import meteordevelopment.meteorclient.systems.modules.render.marker.Marker;
import meteordevelopment.meteorclient.systems.modules.render.nametags.Nametags;
import meteordevelopment.meteorclient.systems.modules.world.Timer;
import meteordevelopment.meteorclient.systems.modules.world.*;
import meteordevelopment.meteorclient.utils.Utils;
Expand Down
Loading
Loading