Skip to content
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 @@ -2,10 +2,12 @@

import dev.hardaway.wardrobe.api.player.PlayerCosmetic;

import javax.annotation.Nullable;

public interface Cosmetic {

String getId();

void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic);
void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,10 @@ default String getGradientSet() {
return null;
}

@Nullable
default String getGradientFrom() {
return null;
}

String[] collectVariants();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import dev.hardaway.wardrobe.api.property.validator.WardrobeValidators;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.function.Supplier;

public abstract class CosmeticAsset implements WardrobeCosmetic, JsonAssetWithMap<String, DefaultAssetMap<String, CosmeticAsset>> {
Expand Down Expand Up @@ -139,7 +140,7 @@ public String[] getHiddenCosmeticSlotIds() {
}

@Override
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
context.hideSlots(this.getHiddenCosmeticSlotIds());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -159,8 +159,8 @@ public List<CosmeticVariantEntry> getVariantEntries(@Nullable String variantId)
}

@Override
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
super.applyCosmetic(context, slot, playerCosmetic);
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
super.applyCosmetic(context, slot, playerCosmetic, gradientSet, gradientId);
Appearance appearance = this.getAppearance();

if (slot.getArmorSlot() != null && this.getArmorAppearance() != null) {
Expand Down Expand Up @@ -207,12 +207,13 @@ public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, Pl
option = appearance.collectVariants()[0];
}

String variant = playerCosmetic.getVariantId();
String variant = gradientId == null ? playerCosmetic.getVariantId() : gradientId;
if (appearance.getTextureConfig(option).getTexture(variant) == null) {
variant = appearance.getTextureConfig(option).collectVariants()[0];
}

TextureConfig textureConfig = appearance.getTextureConfig(option);
System.out.println("textureConfig: " + textureConfig.getGradientFrom());
context.addAttachment(slot.getId(), new ModelAttachment(
appearance.getModel(option),
textureConfig.getTexture(variant),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ public Appearance getAppearance() {
}

@Override
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
super.applyCosmetic(context, slot, playerCosmetic);
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
super.applyCosmetic(context, slot, playerCosmetic, gradientSet, gradientId);
Appearance appearance = this.getAppearance();

String option = playerCosmetic.getOptionId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
import dev.hardaway.wardrobe.api.cosmetic.WardrobeCosmeticSlot;
import dev.hardaway.wardrobe.api.player.PlayerCosmetic;

import javax.annotation.Nullable;

public class HytaleBodyCharacteristicCosmetic extends HytaleCosmetic {
public HytaleBodyCharacteristicCosmetic(CosmeticType type, PlayerSkinPart part) {
super(type, part);
}

@Override
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
Model model = context.getPlayerModel();
context.setPlayerModel(new Model(
model.getModelAssetId(),
Expand All @@ -23,8 +25,8 @@ public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, Pl
model.getBoundingBox(),
this.getPart().getModel(),
this.getPart().getGreyscaleTexture(),
this.getPart().getGradientSet(),
playerCosmetic.getVariantId(),
gradientSet == null ? this.getPart().getGradientSet() : gradientSet,
gradientId == null ? playerCosmetic.getVariantId() : gradientId,
model.getEyeHeight(),
model.getCrouchOffset(),
model.getSittingOffset(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,9 @@ public PlayerSkinPart getPart() {
}

@Nullable
protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
String model;
String texture;
@Nullable String gradientSet = null;
@Nullable String gradientId = null;

if (!this.variantMap.isEmpty()) {
PlayerSkinPart.Variant variant = this.variantMap.get(playerCosmetic.getOptionId());
Expand All @@ -63,8 +61,8 @@ protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosm
texture = partTexture.getTexture();
} else {
texture = variant.getGreyscaleTexture();
gradientSet = this.part.getGradientSet();
gradientId = playerCosmetic.getVariantId();
gradientSet = gradientSet == null ? this.part.getGradientSet() : gradientSet;
gradientId = gradientId == null ? playerCosmetic.getVariantId() : gradientId;
}
} else {
model = this.part.getModel();
Expand All @@ -76,8 +74,8 @@ protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosm
texture = partTexture.getTexture();
} else {
texture = this.part.getGreyscaleTexture();
gradientSet = this.part.getGradientSet();
gradientId = playerCosmetic.getVariantId();
gradientSet = gradientSet == null ? this.part.getGradientSet() : gradientSet;
gradientId = gradientId == null ? playerCosmetic.getVariantId() : gradientId;
}
}

Expand All @@ -95,8 +93,8 @@ protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosm
}

@Override
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
ModelAttachment attachment = this.createAttachment(context, slot, playerCosmetic);
public void applyCosmetic(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
ModelAttachment attachment = this.createAttachment(context, slot, playerCosmetic, gradientSet, gradientId);
if (attachment == null) return;
// TODO: warn?
context.addAttachment(slot.getId(), attachment);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import dev.hardaway.wardrobe.api.player.PlayerCosmetic;
import dev.hardaway.wardrobe.impl.cosmetic.ModelAttachmentCosmetic;

import javax.annotation.Nullable;
import java.util.Objects;

public class HytaleHaircutCosmetic extends HytaleCosmetic {
Expand All @@ -19,8 +20,8 @@ public HytaleHaircutCosmetic(CosmeticType type, PlayerSkinPart part) {
}

@Override
protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic) {
ModelAttachment attachment = super.createAttachment(context, slot, playerCosmetic);
protected ModelAttachment createAttachment(WardrobeContext context, WardrobeCosmeticSlot slot, PlayerCosmetic playerCosmetic, @Nullable String gradientSet, @Nullable String gradientId) {
ModelAttachment attachment = super.createAttachment(context, slot, playerCosmetic, gradientSet, gradientId);
if (attachment == null) return null;

CosmeticRegistry cosmeticRegistry = CosmeticsModule.get().getRegistry();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ public class GradientTextureConfig implements TextureConfig {
.metadata(new UIPropertyTitle("Gradient Set")).documentation("The Gradient Set determines which colors appear under the 'Variants' section in the Wardrobe Menu.")
.add()

.append(new KeyedCodec<>("GradientFrom", Codec.STRING, true),
(t, value) -> t.gradientFrom = value,
t -> t.gradientFrom
)
// .addValidator(CommonAssetValidator.TEXTURE_CHARACTER_ATTACHMENT) // TODO: Create validator
.metadata(new UIPropertyTitle("Gradient From")).documentation("The slot to take the gradient and color from.")
.add()

.append(new KeyedCodec<>("GrayscaleTexture", Codec.STRING, true),
(t, value) -> t.grayscaleTexture = value,
t -> t.grayscaleTexture
Expand All @@ -37,13 +45,15 @@ public class GradientTextureConfig implements TextureConfig {
.build();

private String gradientSet;
private String gradientFrom;
private String grayscaleTexture;

private GradientTextureConfig() {
}

public GradientTextureConfig(String gradientSet, String grayscaleTexture) {
public GradientTextureConfig(String gradientSet, String gradientFrom, String grayscaleTexture) {
this.gradientSet = gradientSet;
this.gradientFrom = gradientFrom;
this.grayscaleTexture = grayscaleTexture;
}

Expand All @@ -59,6 +69,12 @@ public String getGradientSet() {
return gradientSet;
}

@Nonnull
@Override
public String getGradientFrom() {
return gradientFrom;
}

@Override
public String[] collectVariants() {
return CosmeticsModule.get().getRegistry().getGradientSets().get(this.getGradientSet()).getGradients().keySet().toArray(String[]::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,14 @@ public void setCosmetic(String slot, PlayerCosmetic cosmetic) {
}

if (CosmeticAsset.getAssetMap().getAsset(cosmetic.getCosmeticId()) instanceof PlayerModelCosmetic) {
for (Map.Entry<String, CosmeticSaveData> entry : this.cosmetics.entrySet()) {
String slotId = entry.getKey();
Iterator<Map.Entry<String, CosmeticSaveData>> iterator = this.cosmetics.entrySet().iterator();

while (iterator.hasNext()) {
Map.Entry<String, CosmeticSaveData> entry = iterator.next();
CosmeticSaveData existingCosmetic = entry.getValue();

if (CosmeticAsset.getAssetMap().getAsset(existingCosmetic.getCosmeticId()) instanceof PlayerModelCosmetic) {
this.cosmetics.remove(slotId);
iterator.remove();
this.cosmeticIdSet.remove(existingCosmetic.getCosmeticId());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@
import com.hypixel.hytale.server.core.universe.PlayerRef;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import dev.hardaway.wardrobe.WardrobeUtil;
import dev.hardaway.wardrobe.api.cosmetic.Cosmetic;
import dev.hardaway.wardrobe.api.cosmetic.WardrobeCosmeticSlot;
import dev.hardaway.wardrobe.api.player.PlayerCosmetic;
import dev.hardaway.wardrobe.api.player.PlayerWardrobe;
import dev.hardaway.wardrobe.impl.cosmetic.CosmeticAsset;
import dev.hardaway.wardrobe.impl.cosmetic.CosmeticSlotAsset;
import dev.hardaway.wardrobe.impl.cosmetic.ModelAttachmentCosmetic;
import dev.hardaway.wardrobe.impl.cosmetic.builtin.HytaleCosmetic;
import dev.hardaway.wardrobe.impl.cosmetic.builtin.HytalePlayerCosmetic;

Expand Down Expand Up @@ -109,6 +111,8 @@ public static Model buildWardrobeModel(Player player, PlayerSettings playerSetti
}
}

Map<String, ModelAttachmentCosmetic> applyAfter = new HashMap<>();

// Apply custom cosmetics
context.getCosmeticMap().forEach((slotId, cosmetic) -> {
WardrobeCosmeticSlot slot = slots.get(slotId); // TODO: replace with registry
Expand All @@ -121,11 +125,31 @@ public static Model buildWardrobeModel(Player player, PlayerSettings playerSetti

cosmeticData = new HytalePlayerCosmetic(part);
}

cosmetic.applyCosmetic(context, slot, cosmeticData);
if (cosmetic instanceof ModelAttachmentCosmetic modelAttachmentCosmetic) {
if (modelAttachmentCosmetic.getAppearance().getTextureConfig(null).getGradientFrom() != null) {
applyAfter.put(slotId, modelAttachmentCosmetic);
return;
}
}
cosmetic.applyCosmetic(context, slot, cosmeticData, null, null);
}
});

for (String slotId : applyAfter.keySet()) {
ModelAttachmentCosmetic cosmetic = applyAfter.get(slotId);
String gradientFrom = cosmetic.getAppearance().getTextureConfig(null).getGradientFrom();
Cosmetic gradientFromCosmetic = context.getCosmeticMap().get(gradientFrom);
PlayerCosmetic gradientFromPlayerCosmetic = context.getCosmetic(gradientFrom);
if (gradientFromCosmetic == null || gradientFromPlayerCosmetic == null) continue;
WardrobeCosmeticSlot slot = slots.get(slotId); // TODO: replace with registry
if (slot != null) {
// TODO: validate & warn
String gradientId = gradientFromPlayerCosmetic.getVariantId();
PlayerCosmetic cosmeticData = wardrobeComponent.getCosmetic(slotId);
cosmetic.applyCosmetic(context, slot, cosmeticData, null, gradientId);
}
}

// Handle armor hiding
Set<CosmeticType> hiddenHytaleSlots = new HashSet<>();
ItemContainer armorContainer = player.getInventory().getArmor();
Expand Down