Browse Source

first commit

master
Adrian Siekierka 3 years ago
commit
31d239fabe

+ 7
- 0
LICENSE.md View File

@@ -0,0 +1,7 @@
Copyright (C) 2015 Adrian Siekierka

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 63
- 0
build.gradle View File

@@ -0,0 +1,63 @@
buildscript {
repositories {
mavenCentral()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
}
}

apply plugin: 'forge'

version = "2.0"
group= "pl.asie.ponysocks" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "PonySocks"

minecraft {
version = "1.7.10-10.13.4.1492-1.7.10"
runDir = "eclipse"
}

dependencies {
// you may put jars on which you depend on in ./libs
// or you may define them like so..
//compile "some.group:artifact:version:classifier"
//compile "some.group:artifact:version"
// real examples
//compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
//compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env

// for more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html

}

processResources
{
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version

// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version':project.version, 'mcversion':project.minecraft.version
}
// copy everything else, thats not the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}

+ 30
- 0
src/main/java/pl/asie/ponysocks/ClientProxy.java View File

@@ -0,0 +1,30 @@
package pl.asie.ponysocks;

import net.minecraft.client.renderer.entity.RenderBiped;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraftforge.common.MinecraftForge;

public class ClientProxy extends CommonProxy {
@Override
public int getRenderIndexArmor(String prefix) {
if (prefix == null) {
return 0;
}

for (int i = 0; i < RenderBiped.bipedArmorFilenamePrefix.length; i++) {
if (prefix.equals(RenderBiped.bipedArmorFilenamePrefix[i])) {
return i;
}
}
return RenderingRegistry.addNewArmourRendererPrefix(prefix);
}

@Override
public void registerRenderers() {
PonyRenderListener prl = new PonyRenderListener();
MinecraftForge.EVENT_BUS.register(prl);
FMLCommonHandler.instance().bus().register(prl);
}
}

+ 11
- 0
src/main/java/pl/asie/ponysocks/CommonProxy.java View File

@@ -0,0 +1,11 @@
package pl.asie.ponysocks;

public class CommonProxy {
public int getRenderIndexArmor(String prefix) {
return 0;
}

public void registerRenderers() {

}
}

+ 87
- 0
src/main/java/pl/asie/ponysocks/ItemSock.java View File

@@ -0,0 +1,87 @@
package pl.asie.ponysocks;

import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.EnumHelper;

public class ItemSock extends ItemArmor {
public static final ArmorMaterial MATERIAL = EnumHelper.addArmorMaterial("Sock", 4, new int[]{1, 1, 1, 1}, 5);
protected static boolean IS_SECOND_PHASE;

@SideOnly(Side.CLIENT)
private IIcon[] icons;

public ItemSock() {
super(MATERIAL, 0, 3);
setCreativeTab(PonySocks.tabSocks);
setUnlocalizedName("ponysocks.sock");
}

@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
if ("overlay".equals(type)) {
return "ponysocks:textures/armor/sock_layer_fake.png";
} else {
if (IS_SECOND_PHASE) {
return "ponysocks:textures/armor/sock_layer_1.png";
} else {
return "ponysocks:textures/armor/sock_layer_0.png";
}
}
}

@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister register) {
icons = new IIcon[3];
icons[0] = register.registerIcon("ponysocks:icon_sock_layer_0");
icons[1] = register.registerIcon("ponysocks:icon_sock_layer_1");
icons[2] = register.registerIcon("ponysocks:icon_sock_overlay");
}

@Override
@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses() {
return true;
}

@Override
public int getRenderPasses(int metadata) {
return 3;
}

@Override
public int getColor(ItemStack stack) {
return getColor(stack, IS_SECOND_PHASE);
}

private int getColor(ItemStack stack, boolean passTwo) {
NBTTagCompound compound = stack.getTagCompound();
String key = passTwo ? "color2" : "color1";

if (compound != null && compound.hasKey(key)) {
return compound.getInteger(key);
} else {
return 16777215;
}
}

@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack stack, int pass) {
return pass == 2 ? 16777215 : getColor(stack, pass == 1);
}

@Override
@SideOnly(Side.CLIENT)
public IIcon getIconFromDamageForRenderPass(int damage, int pass) {
return icons[pass % 3];
}
}

+ 230
- 0
src/main/java/pl/asie/ponysocks/PonyRenderListener.java View File

@@ -0,0 +1,230 @@
package pl.asie.ponysocks;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.entity.RendererLivingEntity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.client.event.RenderPlayerEvent;

/**
* Created by asie on 10/30/15.
*/
public class PonyRenderListener {
private float partialTicks;
private Method shouldRenderPassMethod, func_82408_cMethod;
private Field f;

public PonyRenderListener() {
try {
func_82408_cMethod = RendererLivingEntity.class.getDeclaredMethod("func_82408_c", EntityLivingBase.class, int.class, float.class);
func_82408_cMethod.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}

try {
f = RendererLivingEntity.class.getDeclaredField("renderPassModel");
f.setAccessible(true);
} catch (NoSuchFieldException e) {
try {
f = RendererLivingEntity.class.getDeclaredField("field_77046_h");
f.setAccessible(true);
} catch (NoSuchFieldException ee) {
ee.printStackTrace();
}
}

try {
shouldRenderPassMethod = RendererLivingEntity.class.getDeclaredMethod("shouldRenderPass", EntityLivingBase.class, int.class, float.class);
shouldRenderPassMethod.setAccessible(true);
} catch (NoSuchMethodException e) {
try {
shouldRenderPassMethod = RendererLivingEntity.class.getDeclaredMethod("func_77032_a", EntityLivingBase.class, int.class, float.class);
shouldRenderPassMethod.setAccessible(true);
} catch (NoSuchMethodException ee) {
ee.printStackTrace();
}
}
}
protected float getDeathMaxRotation(EntityLivingBase p_77037_1_)
{
return 90.0F;
}

protected void renderLivingAt(EntityLivingBase p_77039_1_, double p_77039_2_, double p_77039_4_, double p_77039_6_)
{
GL11.glTranslatef((float)p_77039_2_, (float)p_77039_4_, (float)p_77039_6_);
}

protected void rotateCorpse(EntityLivingBase p_77043_1_, float p_77043_2_, float p_77043_3_, float p_77043_4_)
{
GL11.glRotatef(180.0F - p_77043_3_, 0.0F, 1.0F, 0.0F);

if (p_77043_1_.deathTime > 0)
{
float f3 = ((float)p_77043_1_.deathTime + p_77043_4_ - 1.0F) / 20.0F * 1.6F;
f3 = MathHelper.sqrt_float(f3);

if (f3 > 1.0F)
{
f3 = 1.0F;
}

GL11.glRotatef(f3 * this.getDeathMaxRotation(p_77043_1_), 0.0F, 0.0F, 1.0F);
}
else
{
String s = EnumChatFormatting.getTextWithoutFormattingCodes(p_77043_1_.getCommandSenderName());

if ((s.equals("Dinnerbone") || s.equals("Grumm")) && (!(p_77043_1_ instanceof EntityPlayer) || !((EntityPlayer)p_77043_1_).getHideCape()))
{
GL11.glTranslatef(0.0F, p_77043_1_.height + 0.1F, 0.0F);
GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
}
}
}
private float interpolateRotation(float p_77034_1_, float p_77034_2_, float p_77034_3_)
{
float f3;

for (f3 = p_77034_2_ - p_77034_1_; f3 < -180.0F; f3 += 360.0F)
{
;
}

while (f3 >= 180.0F)
{
f3 -= 360.0F;
}

return p_77034_1_ + p_77034_3_ * f3;
}

protected float handleRotationFloat(EntityLivingBase p_77044_1_, float p_77044_2_)
{
return (float)p_77044_1_.ticksExisted + p_77044_2_;
}

@SubscribeEvent
public void onRenderStart(TickEvent.RenderTickEvent event) {
if (event.phase == TickEvent.Phase.START) {
partialTicks = event.renderTickTime;
}
}

private float playerPT;
private boolean playerPTPresent;

@SubscribeEvent
public void onRenderStart(RenderPlayerEvent.Pre event) {
playerPT = event.partialRenderTick;
playerPTPresent = true;
}

@SubscribeEvent
public void onEntityRenderPost(RenderLivingEvent.Post event) {
if (event.entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) event.entity;
ItemStack stack = player.getCurrentArmor(0);
if (stack != null && stack.getItem() instanceof ItemSock) {
ItemSock.IS_SECOND_PHASE = true;

GL11.glPushMatrix();
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glEnable(GL11.GL_ALPHA_TEST);

try {
float p_76986_9_ = playerPTPresent ? playerPT : partialTicks;
playerPTPresent = false;

float f2 = this.interpolateRotation(player.prevRenderYawOffset, player.renderYawOffset, p_76986_9_);
float f3 = this.interpolateRotation(player.prevRotationYawHead, player.rotationYawHead, p_76986_9_);
float f4;

if (player.isRiding() && player.ridingEntity instanceof EntityLivingBase)
{
EntityLivingBase entitylivingbase1 = (EntityLivingBase)player.ridingEntity;
f2 = this.interpolateRotation(entitylivingbase1.prevRenderYawOffset, entitylivingbase1.renderYawOffset, p_76986_9_);
f4 = MathHelper.wrapAngleTo180_float(f3 - f2);

if (f4 < -85.0F)
{
f4 = -85.0F;
}

if (f4 >= 85.0F)
{
f4 = 85.0F;
}

f2 = f3 - f4;

if (f4 * f4 > 2500.0F)
{
f2 += f4 * 0.2F;
}
}

this.renderLivingAt(player, event.x, event.y, event.z);
float f13 = player.prevRotationPitch + (player.rotationPitch - player.prevRotationPitch) * p_76986_9_;
f4 = this.handleRotationFloat(player, p_76986_9_);
this.rotateCorpse(player, f4, f2, p_76986_9_);
float f5 = 0.0625F;
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glScalef(-1.0F, -1.0F, 1.0F);
GL11.glTranslatef(0.0F, -24.0F * f5 - 0.0078125F, 0.0F);
float f6 = player.prevLimbSwingAmount + (player.limbSwingAmount - player.prevLimbSwingAmount) * p_76986_9_;
float f7 = player.limbSwing - player.limbSwingAmount * (1.0F - p_76986_9_);

if (player.isChild())
{
f7 *= 3.0F;
}

if (f6 > 1.0F)
{
f6 = 1.0F;
}

ModelBase renderPassModelT = (ModelBase) f.get(event.renderer);
if (renderPassModelT.getClass() != ModelBiped.class) {
GL11.glTranslatef(0, 0.25F + 0.125F, 0);
GL11.glScalef(0.75F, 0.75F, 0.75F);
} else {
GL11.glScalef(1 / 1.0625F, 1 / 1.0625F, 1 / 1.0625F);
GL11.glTranslatef(0, 0.09675F, 0);
}

shouldRenderPassMethod.invoke(event.renderer, player, 3, p_76986_9_);
ModelBase renderPassModel = (ModelBase) f.get(event.renderer);

renderPassModel.setLivingAnimations(player, f7, f6, p_76986_9_);
renderPassModel.render(player, f7, f6, f4, f3 - f2, f13, f5);
func_82408_cMethod.invoke(event.renderer, player, 3, p_76986_9_);
renderPassModel.render(player, f7, f6, f4, f3 - f2, f13, f5);
} catch (Exception e) {
e.printStackTrace();
}

GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();

ItemSock.IS_SECOND_PHASE = false;
}
}
}
}

+ 90
- 0
src/main/java/pl/asie/ponysocks/PonySocks.java View File

@@ -0,0 +1,90 @@
package pl.asie.ponysocks;

import java.util.Random;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraftforge.oredict.OreDictionary;

@Mod(modid = PonySocks.MODID, version = PonySocks.VERSION, acceptableRemoteVersions="*")
public class PonySocks {
private static final boolean DEBUG_LOGIN = false;

public static CreativeTabs tabSocks = new CreativeTabs("tabPonySocks") {
@Override
public ItemStack getIconItemStack() {
return new ItemStack(sock);
}

@Override
public Item getTabIconItem() {
return sock;
}
};

@SidedProxy(clientSide = "pl.asie.ponysocks.ClientProxy", serverSide = "pl.asie.ponysocks.CommonProxy")
public static CommonProxy proxy;

public static final int[] woolIds = new int[16];

public static final String MODID = "ponysocks";
public static final String VERSION = "2.0";
public static final Random RANDOM = new Random();
public static final Logger LOGGER = LogManager.getLogger("asietweaks");

public static ItemSock sock;

@EventHandler
public void preInit(FMLPreInitializationEvent event) {
sock = new ItemSock();
GameRegistry.registerItem(sock, "sockItem");
}

@EventHandler
public void init(FMLInitializationEvent event) {
proxy.registerRenderers();
}

@EventHandler
public void postInit(FMLPostInitializationEvent event) {
String[] dyes =
{
"Black",
"Red",
"Green",
"Brown",
"Blue",
"Purple",
"Cyan",
"LightGray",
"Gray",
"Pink",
"Lime",
"Yellow",
"LightBlue",
"Magenta",
"Orange",
"White"
};

for (int i = 0; i < 16; i++) {
woolIds[i] = OreDictionary.getOreID("dye" + dyes[15 - i]);
}

GameRegistry.addShapedRecipe(new ItemStack(sock), "w w", "w w", 'w', Blocks.wool);
GameRegistry.addRecipe(new RecipeSockColor());
}
}

+ 215
- 0
src/main/java/pl/asie/ponysocks/RecipeSockColor.java View File

@@ -0,0 +1,215 @@
package pl.asie.ponysocks;

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

import net.minecraft.entity.passive.EntitySheep;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;

import net.minecraftforge.oredict.OreDictionary;

public class RecipeSockColor implements IRecipe {
@Override
public boolean matches(InventoryCrafting crafting, World world) {
boolean foundSock = false;
int dyeCount = 0;

for (int i = 0; i < crafting.getSizeInventory(); i++) {
ItemStack s = crafting.getStackInSlot(i);
if (s != null && s.getItem() != null) {
if (s.getItem() instanceof ItemSock) {
if (foundSock) {
return false;
} else {
foundSock = true;
}
} else {
int[] ids = OreDictionary.getOreIDs(s);
boolean found = false;
for (int ii : ids) {
for (int j : PonySocks.woolIds) {
if (ii == j) {
found = true;
dyeCount++;
break;
}
}
if (found) {
break;
}
}
if (!found) {
return false;
}
}
}
}
return dyeCount > 0;
}

@Override
public ItemStack getCraftingResult(InventoryCrafting crafting) {
List<Integer> dyeColorsLeft = new ArrayList<Integer>();
List<Integer> dyeColorsRight = new ArrayList<Integer>();
ItemStack sock = null;
int sockX = -1;
int sockY = -1;
int fWidth = (int) Math.floor(Math.sqrt(crafting.getSizeInventory()));
for (int i = 0; i < crafting.getSizeInventory(); i++) {
ItemStack s = crafting.getStackInSlot(i);
if (s != null && s.getItem() != null) {
if (s.getItem() instanceof ItemSock) {
if (sock != null) {
return null;
}
sock = s;
sockX = i % fWidth;
sockY = i / fWidth;
}
}
}
if (sock == null) {
return null;
}
for (int i = 0; i < crafting.getSizeInventory(); i++) {
ItemStack s = crafting.getStackInSlot(i);
if (s != null && s.getItem() != null) {
if (s.getItem() instanceof ItemSock) {
continue;
} else {
int[] ids = OreDictionary.getOreIDs(s);
boolean found = false;
for (int ii : ids) {
for (int j = 0; j < PonySocks.woolIds.length; j++) {
if (ii == PonySocks.woolIds[j]) {
int px = i % fWidth;
int py = i / fWidth;
if (px < sockX || (px == sockX && py < sockY)) {
dyeColorsLeft.add(j);
} else {
dyeColorsRight.add(j);
}
found = true;
break;
}
}
if (found) {
break;
}
}
if (!found) {
return null;
}
}
}
}

int[] colorLeft = new int[3];
int colorLeftCount = 0;
int colorLeftMax = 0;

int[] colorRight = new int[3];
int colorRightCount = 0;
int colorRightMax = 0;

for (int i: dyeColorsLeft) {
float[] col = EntitySheep.fleeceColorTable[i];
int r = (int)(col[0] * 255.0F);
int g = (int)(col[1] * 255.0F);
int b = (int)(col[2] * 255.0F);
colorLeftMax += Math.max(r, Math.max(g, b));
colorLeft[0] += r;
colorLeft[1] += g;
colorLeft[2] += b;
colorLeftCount++;
}

for (int i: dyeColorsRight) {
float[] col = EntitySheep.fleeceColorTable[i];
int r = (int)(col[0] * 255.0F);
int g = (int)(col[1] * 255.0F);
int b = (int)(col[2] * 255.0F);
colorRightMax += Math.max(r, Math.max(g, b));
colorRight[0] += r;
colorRight[1] += g;
colorRight[2] += b;
colorRightCount++;
}

if (colorLeftCount == 0 && colorRightCount == 0) {
return null;
}

NBTTagCompound cpd = sock.getTagCompound();
if (cpd != null) {
if (cpd.hasKey("color1")) {
int c = cpd.getInteger("color1");
int r = (c >> 16 & 255);
int g = (c >> 8 & 255);
int b = (c & 255);
colorLeftMax += Math.max(r, Math.max(g, b));
colorLeft[0] += r;
colorLeft[1] += g;
colorLeft[2] += b;
colorLeftCount++;
}

if (cpd.hasKey("color2")) {
int c = cpd.getInteger("color2");
int r = (c >> 16 & 255);
int g = (c >> 8 & 255);
int b = (c & 255);
colorRightMax += Math.max(r, Math.max(g, b));
colorRight[0] += r;
colorRight[1] += g;
colorRight[2] += b;
colorRightCount++;
}
}

sock = sock.copy();
if (sock.getTagCompound() == null) {
sock.setTagCompound(new NBTTagCompound());
}

if (colorLeftCount > 0) {
int rAvgL = colorLeft[0] / colorLeftCount;
int gAvgL = colorLeft[1] / colorLeftCount;
int bAvgL = colorLeft[2] / colorLeftCount;
float var16 = (float) colorLeftMax / (float) colorLeftCount;
float var17 = (float) Math.max(rAvgL, Math.max(gAvgL, bAvgL));
rAvgL = (int) ((float) rAvgL * var16 / var17);
gAvgL = (int) ((float) gAvgL * var16 / var17);
bAvgL = (int) ((float) bAvgL * var16 / var17);
sock.getTagCompound().setInteger("color1", rAvgL << 16 | gAvgL << 8 | bAvgL);
}

if (colorRightCount > 0) {
int rAvgR = colorRight[0] / colorRightCount;
int gAvgR = colorRight[1] / colorRightCount;
int bAvgR = colorRight[2] / colorRightCount;
float var16 = (float) colorRightMax / (float) colorRightCount;
float var17 = (float) Math.max(rAvgR, Math.max(gAvgR, bAvgR));
rAvgR = (int) ((float) rAvgR * var16 / var17);
gAvgR = (int) ((float) gAvgR * var16 / var17);
bAvgR = (int) ((float) bAvgR * var16 / var17);
sock.getTagCompound().setInteger("color2", rAvgR << 16 | gAvgR << 8 | bAvgR);
}

return sock;
}

@Override
public int getRecipeSize() {
return 10;
}

@Override
public ItemStack getRecipeOutput() {
return null;
}
}

+ 2
- 0
src/main/resources/assets/ponysocks/lang/en_US.lang View File

@@ -0,0 +1,2 @@
item.ponysocks.sock.name=Socks
itemGroup.tabPonySocks=PonySocks

BIN
src/main/resources/assets/ponysocks/textures/armor/sock_layer_0.png View File


BIN
src/main/resources/assets/ponysocks/textures/armor/sock_layer_1.png View File


BIN
src/main/resources/assets/ponysocks/textures/armor/sock_layer_fake.png View File


BIN
src/main/resources/assets/ponysocks/textures/items/icon_sock_layer_0.png View File


BIN
src/main/resources/assets/ponysocks/textures/items/icon_sock_layer_1.png View File


BIN
src/main/resources/assets/ponysocks/textures/items/icon_sock_overlay.png View File


Loading…
Cancel
Save