This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
RelicCraft/src/main/java/com/thebrokenrail/reliccraft/item/TimeDilaterItem.java

141 lines
4.9 KiB
Java

package com.thebrokenrail.reliccraft.item;
import com.thebrokenrail.reliccraft.RelicCraft;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.MessageType;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.stat.Stats;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.*;
import net.minecraft.world.PersistentState;
import net.minecraft.world.World;
import java.util.List;
public class TimeDilaterItem extends Item {
public enum TimeSpeed {
NORMAL,
FAST,
VERY_FAST
}
public static final String TIME_SPEED_KEY = new Identifier(RelicCraft.NAMESPACE, "time_speed").toString();
public static class TimeSpeedState extends PersistentState {
private TimeSpeed timeSpeed = TimeSpeed.NORMAL;
public TimeSpeedState() {
super(TIME_SPEED_KEY);
}
public void setTimeSpeed(TimeSpeed timeSpeed) {
this.timeSpeed = timeSpeed;
markDirty();
}
public TimeSpeed getTimeSpeed() {
return timeSpeed;
}
@Override
public void fromTag(CompoundTag tag) {
timeSpeed = TimeSpeed.valueOf(tag.getString("TimeSpeed"));
}
@Override
public CompoundTag toTag(CompoundTag tag) {
tag.putString("TimeSpeed", timeSpeed.name());
return tag;
}
}
public interface DilatedWorld {
void setTimeSpeed(TimeSpeed speed);
TimeSpeed getTimeSpeed();
}
public TimeDilaterItem() {
super(new Settings().group(RelicCraft.ITEM_GROUP).maxDamage(9).rarity(Rarity.UNCOMMON));
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
ItemStack stack = user.getStackInHand(hand);
user.incrementStat(Stats.USED.getOrCreateStat(this));
if (!world.isClient()) {
DilatedWorld dilatedWorld = (DilatedWorld) world;
switch (dilatedWorld.getTimeSpeed()) {
case FAST: {
dilatedWorld.setTimeSpeed(TimeSpeed.VERY_FAST);
break;
}
case VERY_FAST: {
dilatedWorld.setTimeSpeed(TimeSpeed.NORMAL);
break;
}
case NORMAL: {
dilatedWorld.setTimeSpeed(TimeSpeed.FAST);
break;
}
}
assert world.getServer() != null;
world.getServer().getPlayerManager().sendToAll(new GameMessageS2CPacket(new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change", user.getDisplayName(), new LiteralText("[").append(new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change." + dilatedWorld.getTimeSpeed().name().toLowerCase())).append("]").formatted(Formatting.YELLOW)), MessageType.CHAT, Util.NIL_UUID));
RelicCraft.DILATE_TIME_CRITERION.trigger((ServerPlayerEntity) user);
}
RelicCraft.playRelicSound(user);
stack.damage(1, user, e -> e.sendToolBreakStatus(hand));
return new TypedActionResult<>(ActionResult.SUCCESS, stack);
}
@Override
@Environment(EnvType.CLIENT)
public void appendTooltip(ItemStack stack, World world, List<Text> tooltip, TooltipContext context) {
super.appendTooltip(stack, world, tooltip, context);
if (world != null) {
tooltip.add(new TranslatableText("item." + RelicCraft.NAMESPACE + ".tooltip.time_dilater", new TranslatableText("chat." + RelicCraft.NAMESPACE + ".announce_time_speed_change." + ((DilatedWorld) world).getTimeSpeed().name().toLowerCase()).formatted(Formatting.GRAY)).formatted(Formatting.WHITE));
}
}
@Override
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
CompoundTag tag = stack.getTag();
if (tag == null) {
tag = new CompoundTag();
}
if (entity instanceof ServerPlayerEntity && tag.getByte("Artificial") == 1) {
RelicCraft.DUPLICATE_TIME_DILATER_CRITERION.trigger((ServerPlayerEntity) entity);
tag.putByte("Artificial", (byte) 2);
}
}
public static long getTimeDilationFactor(TimeSpeed speed) {
switch (speed) {
case FAST: {
return 4L;
}
case VERY_FAST: {
return 8L;
}
default:
case NORMAL: {
return 1L;
}
}
}
}