214 lines
6.1 KiB
Java
214 lines
6.1 KiB
Java
package net.minecraft.tileentity;
|
|
|
|
import com.google.common.collect.Iterables;
|
|
import com.mojang.authlib.GameProfile;
|
|
import com.mojang.authlib.minecraft.MinecraftSessionService;
|
|
import com.mojang.authlib.properties.Property;
|
|
import java.util.UUID;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.block.BlockSkull;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTUtil;
|
|
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
|
|
import net.minecraft.server.management.PlayerProfileCache;
|
|
import net.minecraft.util.EnumFacing;
|
|
import net.minecraft.util.ITickable;
|
|
import net.minecraft.util.Mirror;
|
|
import net.minecraft.util.Rotation;
|
|
import net.minecraft.util.StringUtils;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
|
|
public class TileEntitySkull extends TileEntity implements ITickable
|
|
{
|
|
private int skullType;
|
|
private int skullRotation;
|
|
private GameProfile playerProfile;
|
|
private int dragonAnimatedTicks;
|
|
private boolean dragonAnimated;
|
|
private static PlayerProfileCache profileCache;
|
|
private static MinecraftSessionService sessionService;
|
|
|
|
public static void setProfileCache(PlayerProfileCache profileCacheIn)
|
|
{
|
|
profileCache = profileCacheIn;
|
|
}
|
|
|
|
public static void setSessionService(MinecraftSessionService sessionServiceIn)
|
|
{
|
|
sessionService = sessionServiceIn;
|
|
}
|
|
|
|
public NBTTagCompound writeToNBT(NBTTagCompound compound)
|
|
{
|
|
super.writeToNBT(compound);
|
|
compound.setByte("SkullType", (byte)(this.skullType & 255));
|
|
compound.setByte("Rot", (byte)(this.skullRotation & 255));
|
|
|
|
if (this.playerProfile != null)
|
|
{
|
|
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
|
NBTUtil.writeGameProfile(nbttagcompound, this.playerProfile);
|
|
compound.setTag("Owner", nbttagcompound);
|
|
}
|
|
|
|
return compound;
|
|
}
|
|
|
|
public void readFromNBT(NBTTagCompound compound)
|
|
{
|
|
super.readFromNBT(compound);
|
|
this.skullType = compound.getByte("SkullType");
|
|
this.skullRotation = compound.getByte("Rot");
|
|
|
|
if (this.skullType == 3)
|
|
{
|
|
if (compound.hasKey("Owner", 10))
|
|
{
|
|
this.playerProfile = NBTUtil.readGameProfileFromNBT(compound.getCompoundTag("Owner"));
|
|
}
|
|
else if (compound.hasKey("ExtraType", 8))
|
|
{
|
|
String s = compound.getString("ExtraType");
|
|
|
|
if (!StringUtils.isNullOrEmpty(s))
|
|
{
|
|
this.playerProfile = new GameProfile((UUID)null, s);
|
|
this.updatePlayerProfile();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Like the old updateEntity(), except more generic.
|
|
*/
|
|
public void update()
|
|
{
|
|
if (this.skullType == 5)
|
|
{
|
|
if (this.world.isBlockPowered(this.pos))
|
|
{
|
|
this.dragonAnimated = true;
|
|
++this.dragonAnimatedTicks;
|
|
}
|
|
else
|
|
{
|
|
this.dragonAnimated = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public float getAnimationProgress(float p_184295_1_)
|
|
{
|
|
return this.dragonAnimated ? (float)this.dragonAnimatedTicks + p_184295_1_ : (float)this.dragonAnimatedTicks;
|
|
}
|
|
|
|
@Nullable
|
|
public GameProfile getPlayerProfile()
|
|
{
|
|
return this.playerProfile;
|
|
}
|
|
|
|
@Nullable
|
|
public SPacketUpdateTileEntity getUpdatePacket()
|
|
{
|
|
return new SPacketUpdateTileEntity(this.pos, 4, this.getUpdateTag());
|
|
}
|
|
|
|
public NBTTagCompound getUpdateTag()
|
|
{
|
|
return this.writeToNBT(new NBTTagCompound());
|
|
}
|
|
|
|
public void setType(int type)
|
|
{
|
|
this.skullType = type;
|
|
this.playerProfile = null;
|
|
}
|
|
|
|
public void setPlayerProfile(@Nullable GameProfile playerProfile)
|
|
{
|
|
this.skullType = 3;
|
|
this.playerProfile = playerProfile;
|
|
this.updatePlayerProfile();
|
|
}
|
|
|
|
private void updatePlayerProfile()
|
|
{
|
|
this.playerProfile = updateGameprofile(this.playerProfile);
|
|
this.markDirty();
|
|
}
|
|
|
|
public static GameProfile updateGameprofile(GameProfile input)
|
|
{
|
|
if (input != null && !StringUtils.isNullOrEmpty(input.getName()))
|
|
{
|
|
if (input.isComplete() && input.getProperties().containsKey("textures"))
|
|
{
|
|
return input;
|
|
}
|
|
else if (profileCache != null && sessionService != null)
|
|
{
|
|
GameProfile gameprofile = profileCache.getGameProfileForUsername(input.getName());
|
|
|
|
if (gameprofile == null)
|
|
{
|
|
return input;
|
|
}
|
|
else
|
|
{
|
|
Property property = (Property)Iterables.getFirst(gameprofile.getProperties().get("textures"), (Object)null);
|
|
|
|
if (property == null)
|
|
{
|
|
gameprofile = sessionService.fillProfileProperties(gameprofile, true);
|
|
}
|
|
|
|
return gameprofile;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return input;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return input;
|
|
}
|
|
}
|
|
|
|
public int getSkullType()
|
|
{
|
|
return this.skullType;
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public int getSkullRotation()
|
|
{
|
|
return this.skullRotation;
|
|
}
|
|
|
|
public void setSkullRotation(int rotation)
|
|
{
|
|
this.skullRotation = rotation;
|
|
}
|
|
|
|
public void mirror(Mirror mirrorIn)
|
|
{
|
|
if (this.world != null && this.world.getBlockState(this.getPos()).getValue(BlockSkull.FACING) == EnumFacing.UP)
|
|
{
|
|
this.skullRotation = mirrorIn.mirrorRotation(this.skullRotation, 16);
|
|
}
|
|
}
|
|
|
|
public void rotate(Rotation rotationIn)
|
|
{
|
|
if (this.world != null && this.world.getBlockState(this.getPos()).getValue(BlockSkull.FACING) == EnumFacing.UP)
|
|
{
|
|
this.skullRotation = rotationIn.rotate(this.skullRotation, 16);
|
|
}
|
|
}
|
|
} |