2019-01-30 11:26:00 +01:00
|
|
|
package com.minelittlepony.unicopia;
|
|
|
|
|
2019-02-02 21:34:27 +01:00
|
|
|
import java.util.List;
|
2019-01-31 16:21:14 +01:00
|
|
|
import java.util.UUID;
|
|
|
|
|
2019-01-30 11:26:00 +01:00
|
|
|
import javax.annotation.Nullable;
|
|
|
|
|
|
|
|
import com.minelittlepony.jumpingcastle.api.Target;
|
|
|
|
import com.minelittlepony.unicopia.hud.UHud;
|
|
|
|
import com.minelittlepony.unicopia.input.Keyboard;
|
|
|
|
import com.minelittlepony.unicopia.inventory.gui.GuiOfHolding;
|
|
|
|
import com.minelittlepony.unicopia.network.MsgRequestCapabilities;
|
|
|
|
import com.minelittlepony.unicopia.player.IPlayer;
|
|
|
|
import com.minelittlepony.unicopia.player.IView;
|
|
|
|
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
2019-02-06 11:33:42 +01:00
|
|
|
import com.minelittlepony.unicopia.spell.IMagicEffect;
|
|
|
|
import com.minelittlepony.unicopia.spell.SpellDisguise;
|
2019-02-02 21:34:27 +01:00
|
|
|
import com.minelittlepony.util.gui.ButtonGridLayout;
|
|
|
|
import com.minelittlepony.util.gui.UButton;
|
2019-01-30 11:26:00 +01:00
|
|
|
|
|
|
|
import net.minecraft.client.Minecraft;
|
2019-02-02 21:34:27 +01:00
|
|
|
import net.minecraft.client.audio.PositionedSoundRecord;
|
2019-01-30 11:26:00 +01:00
|
|
|
import net.minecraft.client.entity.EntityPlayerSP;
|
2019-02-02 21:34:27 +01:00
|
|
|
import net.minecraft.client.gui.GuiButton;
|
|
|
|
import net.minecraft.client.gui.GuiOptions;
|
2019-02-06 11:33:42 +01:00
|
|
|
import net.minecraft.client.renderer.GlStateManager;
|
|
|
|
import net.minecraft.client.renderer.entity.RenderManager;
|
2019-02-02 21:34:27 +01:00
|
|
|
import net.minecraft.client.resources.I18n;
|
2019-02-06 11:33:42 +01:00
|
|
|
import net.minecraft.entity.Entity;
|
2019-01-30 11:26:00 +01:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
2019-02-02 21:34:27 +01:00
|
|
|
import net.minecraft.init.SoundEvents;
|
2019-01-30 11:26:00 +01:00
|
|
|
import net.minecraft.world.IInteractionObject;
|
|
|
|
import net.minecraftforge.client.event.ColorHandlerEvent;
|
|
|
|
import net.minecraftforge.client.event.EntityViewRenderEvent;
|
|
|
|
import net.minecraftforge.client.event.FOVUpdateEvent;
|
2019-02-02 21:34:27 +01:00
|
|
|
import net.minecraftforge.client.event.GuiScreenEvent;
|
2019-01-30 11:26:00 +01:00
|
|
|
import net.minecraftforge.client.event.RenderGameOverlayEvent;
|
|
|
|
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
|
2019-02-02 17:50:15 +01:00
|
|
|
import net.minecraftforge.client.event.RenderLivingEvent;
|
2019-01-30 11:26:00 +01:00
|
|
|
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
|
|
|
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
|
|
|
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
|
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
|
|
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
|
|
|
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
|
|
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
|
|
|
|
2019-02-02 21:34:27 +01:00
|
|
|
import static com.minelittlepony.util.gui.ButtonGridLayout.*;
|
|
|
|
|
2019-01-30 11:26:00 +01:00
|
|
|
@EventBusSubscriber(Side.CLIENT)
|
|
|
|
public class UnicopiaClient extends UClient {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The race preferred by the client - as determined by mine little pony.
|
|
|
|
* Human if minelp was not installed.
|
|
|
|
*
|
|
|
|
* This is not neccessarily the _actual_ race used for the player,
|
|
|
|
* as the server may not allow certain race types, or the player may override
|
|
|
|
* this option in-game themselves.
|
|
|
|
*/
|
|
|
|
private static Race clientPlayerRace = getclientPlayerRace();
|
|
|
|
|
|
|
|
private static Race getclientPlayerRace() {
|
|
|
|
if (!UConfig.getInstance().ignoresMineLittlePony()
|
2019-02-02 12:23:22 +01:00
|
|
|
&& Minecraft.getMinecraft().player != null) {
|
|
|
|
Race race = MineLP.getPlayerPonyRace();
|
2019-01-30 11:26:00 +01:00
|
|
|
|
|
|
|
if (!race.isDefault()) {
|
|
|
|
return race;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-02 21:34:27 +01:00
|
|
|
|
2019-01-30 11:26:00 +01:00
|
|
|
return UConfig.getInstance().getPrefferedRace();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void displayGuiToPlayer(EntityPlayer player, IInteractionObject inventory) {
|
|
|
|
if (player instanceof EntityPlayerSP) {
|
|
|
|
if ("unicopia:itemofholding".equals(inventory.getGuiID())) {
|
|
|
|
Minecraft.getMinecraft().displayGuiScreen(new GuiOfHolding(inventory));
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
super.displayGuiToPlayer(player, inventory);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-31 16:21:14 +01:00
|
|
|
@Override
|
2019-01-30 11:26:00 +01:00
|
|
|
@Nullable
|
|
|
|
public EntityPlayer getPlayer() {
|
|
|
|
return Minecraft.getMinecraft().player;
|
|
|
|
}
|
|
|
|
|
2019-01-31 16:21:14 +01:00
|
|
|
@Override
|
|
|
|
@Nullable
|
|
|
|
public EntityPlayer getPlayerByUUID(UUID playerId) {
|
|
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
|
|
|
|
if (mc.player.getUniqueID().equals(playerId)) {
|
|
|
|
return mc.player;
|
|
|
|
}
|
|
|
|
|
|
|
|
return mc.world.getPlayerEntityByUUID(playerId);
|
|
|
|
}
|
|
|
|
|
2019-01-30 21:17:46 +01:00
|
|
|
@Override
|
|
|
|
public boolean isClientPlayer(@Nullable EntityPlayer player) {
|
|
|
|
if (getPlayer() == player) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (getPlayer() == null || player == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return getPlayer().getGameProfile().getId().equals(player.getGameProfile().getId());
|
|
|
|
}
|
|
|
|
|
2019-02-02 17:50:15 +01:00
|
|
|
@Override
|
|
|
|
public int getViewMode() {
|
|
|
|
return Minecraft.getMinecraft().gameSettings.thirdPersonView;
|
|
|
|
}
|
|
|
|
|
2019-02-02 21:34:27 +01:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void onDisplayGui(GuiScreenEvent.InitGuiEvent.Post event) {
|
|
|
|
if (event.getGui() instanceof GuiOptions) {
|
|
|
|
addUniButton(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void addUniButton(GuiScreenEvent.InitGuiEvent.Post event) {
|
|
|
|
ButtonGridLayout layout = new ButtonGridLayout(event.getButtonList());
|
|
|
|
|
|
|
|
GuiButton uni = new UButton(layout.getNextButtonId(), 0, 0, 150, 20, I18n.format("gui.unicopia"), b -> {
|
|
|
|
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(SoundEvents.BLOCK_ANVIL_USE, 1));
|
|
|
|
b.displayString = "<< WIP >>";
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
|
|
|
|
|
|
|
List<Integer> possibleXCandidates = list(layout.getColumns());
|
|
|
|
List<Integer> possibleYCandidates = list(layout.getRows());
|
|
|
|
|
|
|
|
uni.y = last(possibleYCandidates, 1);
|
|
|
|
|
|
|
|
if (layout.getRows()
|
|
|
|
.filter(y -> layout.getRow(y).size() == 1).count() < 2) {
|
|
|
|
uni.y += 25;
|
|
|
|
uni.x = first(possibleXCandidates, 0);
|
|
|
|
|
|
|
|
layout.getRow(last(possibleYCandidates, 0)).forEach(button -> {
|
|
|
|
button.y = Math.max(button.y, uni.y + uni.height + 13);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
uni.x = first(possibleXCandidates, 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
layout.getElements().add(uni);
|
|
|
|
}
|
|
|
|
|
2019-02-02 17:50:15 +01:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void preEntityRender(RenderLivingEvent.Pre<?> event) {
|
|
|
|
if (event.getEntity() instanceof EntityPlayer) {
|
2019-02-06 11:33:42 +01:00
|
|
|
IPlayer iplayer = PlayerSpeciesList.instance().getPlayer((EntityPlayer)event.getEntity());
|
|
|
|
|
|
|
|
if (iplayer.isInvisible()) {
|
2019-02-02 17:50:15 +01:00
|
|
|
event.setCanceled(true);
|
2019-02-06 11:33:42 +01:00
|
|
|
|
|
|
|
// This fixes lighting errors on the armour slots.
|
|
|
|
// #MahjongPls
|
|
|
|
// @FUF(reason = "Forge should fix this. Cancelling their event skips neccessary state resetting at the end of the render method")
|
|
|
|
GlStateManager.enableAlpha();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (iplayer.hasEffect()) {
|
|
|
|
RenderManager renderMan = Minecraft.getMinecraft().getRenderManager();
|
|
|
|
|
|
|
|
if (renderMan.isRenderShadow()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// I assume we're in the inventory now.
|
|
|
|
IMagicEffect effect = iplayer.getEffect();
|
|
|
|
if (!effect.getDead() && effect instanceof SpellDisguise) {
|
|
|
|
effect.update(iplayer);
|
|
|
|
|
|
|
|
Entity e = ((SpellDisguise)effect).getDisguise();
|
|
|
|
|
|
|
|
// Check for a disguise and render it in our place.
|
|
|
|
if (e != null) {
|
|
|
|
e.setInvisible(false);
|
|
|
|
renderMan.renderEntity(e, 0, 0, 0, 0, 1, false);
|
|
|
|
}
|
|
|
|
}
|
2019-02-02 17:50:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-30 11:26:00 +01:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@Override
|
|
|
|
public void preInit(FMLPreInitializationEvent event) {
|
|
|
|
UEntities.preInit();
|
|
|
|
UParticles.init();
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@Override
|
|
|
|
public void init(FMLInitializationEvent event) {
|
|
|
|
clientPlayerRace = getclientPlayerRace();
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void registerItemColours(ColorHandlerEvent.Item event) {
|
|
|
|
UItems.registerColors(event.getItemColors());
|
|
|
|
UBlocks.registerColors(event.getItemColors(), event.getBlockColors());
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void onRenderHud(RenderGameOverlayEvent.Post event) {
|
|
|
|
if (event.getType() != ElementType.ALL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-30 21:17:46 +01:00
|
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
if (mc.player != null && mc.world != null) {
|
|
|
|
IPlayer player = PlayerSpeciesList.instance().getPlayer(mc.player);
|
2019-01-30 11:26:00 +01:00
|
|
|
|
2019-01-30 21:17:46 +01:00
|
|
|
UHud.instance.renderHud(player, event.getResolution());
|
2019-01-30 11:26:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void modifyFOV(FOVUpdateEvent event) {
|
|
|
|
event.setNewfov(PlayerSpeciesList.instance().getPlayer(event.getEntity()).getCamera().calculateFieldOfView(event.getFov()));
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void onGameTick(TickEvent.ClientTickEvent event) {
|
|
|
|
if (event.phase == Phase.END) {
|
2019-01-30 21:17:46 +01:00
|
|
|
EntityPlayer player = UClient.instance().getPlayer();
|
|
|
|
|
2019-02-06 11:33:42 +01:00
|
|
|
if (player != null && !player.isDead) {
|
2019-01-30 11:26:00 +01:00
|
|
|
Race newRace = getclientPlayerRace();
|
|
|
|
|
|
|
|
if (newRace != clientPlayerRace) {
|
|
|
|
clientPlayerRace = newRace;
|
|
|
|
|
2019-01-30 21:17:46 +01:00
|
|
|
Unicopia.channel.send(new MsgRequestCapabilities(player, clientPlayerRace), Target.SERVER);
|
2019-01-30 11:26:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Keyboard.getKeyHandler().onKeyInput();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@SubscribeEvent
|
|
|
|
public static void setupPlayerCamera(EntityViewRenderEvent.CameraSetup event) {
|
|
|
|
|
2019-01-30 21:17:46 +01:00
|
|
|
EntityPlayer player = UClient.instance().getPlayer();
|
2019-01-30 11:26:00 +01:00
|
|
|
|
|
|
|
if (player != null) {
|
|
|
|
IView view = PlayerSpeciesList.instance().getPlayer(player).getCamera();
|
|
|
|
|
|
|
|
event.setRoll(view.calculateRoll());
|
|
|
|
event.setPitch(view.calculatePitch(event.getPitch()));
|
|
|
|
event.setYaw(view.calculateYaw(event.getYaw()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|