91 lines
3.9 KiB
Java
91 lines
3.9 KiB
Java
package electroblob.wizardry.client.gui;
|
|
|
|
import electroblob.wizardry.item.ISpellCastingItem;
|
|
import electroblob.wizardry.item.ItemArtefact;
|
|
import electroblob.wizardry.packet.PacketControlInput;
|
|
import electroblob.wizardry.packet.WizardryPacketHandler;
|
|
import electroblob.wizardry.registry.Spells;
|
|
import electroblob.wizardry.registry.WizardryItems;
|
|
import electroblob.wizardry.spell.Resurrection;
|
|
import electroblob.wizardry.util.InventoryUtils;
|
|
import electroblob.wizardry.util.SpellModifiers;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.gui.GuiButton;
|
|
import net.minecraft.client.gui.GuiGameOver;
|
|
import net.minecraft.client.resources.I18n;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.util.EnumHand;
|
|
import net.minecraftforge.client.event.GuiScreenEvent;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
|
|
@Mod.EventBusSubscriber(Side.CLIENT)
|
|
public class GuiButtonResurrect extends GuiButton {
|
|
|
|
private static int timeSinceDeath = -1;
|
|
|
|
private final String translationKey;
|
|
|
|
public GuiButtonResurrect(int id, int x, int y, String translationKey){
|
|
super(id, x, y, I18n.format(translationKey + "_wait", Resurrection.getRemainingWaitTime(timeSinceDeath)));
|
|
this.translationKey = translationKey;
|
|
}
|
|
|
|
@Override
|
|
public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks){
|
|
int waitTime = Resurrection.getRemainingWaitTime(timeSinceDeath);
|
|
this.enabled = waitTime == 0;
|
|
this.displayString = I18n.format(translationKey + (waitTime == 0 ? "_ready" : "_wait"), waitTime);
|
|
super.drawButton(mc, mouseX, mouseY, partialTicks);
|
|
}
|
|
|
|
// Event handlers
|
|
|
|
@SubscribeEvent
|
|
public static void onClientTickEvent(TickEvent.ClientTickEvent event){
|
|
if(event.phase == TickEvent.Phase.START && timeSinceDeath >= 0) timeSinceDeath++;
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public static void onGuiScreenInitEvent(GuiScreenEvent.InitGuiEvent event){
|
|
|
|
if(event.getGui() instanceof GuiGameOver && ItemArtefact.isArtefactActive(Minecraft.getMinecraft().player, WizardryItems.amulet_resurrection)
|
|
&& InventoryUtils.getHotbar(Minecraft.getMinecraft().player).stream().anyMatch(s -> Resurrection.canStackResurrect(s, Minecraft.getMinecraft().player))){
|
|
|
|
event.getButtonList().add(new GuiButtonResurrect(event.getButtonList().size(), event.getGui().width / 2 - 100,
|
|
event.getGui().height / 4 + 120, "spell." + Spells.resurrection.getRegistryName() + ".button"));
|
|
timeSinceDeath = 0;
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public static void onGuiScreenActionPerformedEvent(GuiScreenEvent.ActionPerformedEvent event){
|
|
|
|
if(event.getGui() instanceof GuiGameOver){
|
|
|
|
ItemStack stack = InventoryUtils.getHotbar(Minecraft.getMinecraft().player).stream()
|
|
.filter(s -> Resurrection.canStackResurrect(s, Minecraft.getMinecraft().player)).findFirst().orElse(null);
|
|
|
|
if(stack != null){
|
|
|
|
if(event.getButton() instanceof GuiButtonResurrect && timeSinceDeath >= 0){
|
|
// Cast resurrection on the client player and notify the server to do the same
|
|
// ISpellCastingItem#canCast already checked in Resurrection#canStackResurrect
|
|
((ISpellCastingItem)stack.getItem()).cast(stack, Spells.resurrection, Minecraft.getMinecraft().player, EnumHand.MAIN_HAND, 0, new SpellModifiers());
|
|
WizardryPacketHandler.net.sendToServer(new PacketControlInput.Message(PacketControlInput.ControlType.RESURRECT_BUTTON));
|
|
|
|
}else if(!Minecraft.getMinecraft().world.getGameRules().getBoolean("keepInventory")){
|
|
// Any other button drops the wand (N.B. this should be inside the stack != null check or it'll send
|
|
// packets unnecessarily and generate incorrect warnings
|
|
WizardryPacketHandler.net.sendToServer(new PacketControlInput.Message(PacketControlInput.ControlType.CANCEL_RESURRECT));
|
|
}
|
|
|
|
timeSinceDeath = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|