2020-04-04 02:32:34 +00:00
|
|
|
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.server.network.ServerPlayerEntity;
|
2020-04-15 22:19:40 +00:00
|
|
|
import net.minecraft.stat.Stats;
|
2020-04-04 02:32:34 +00:00
|
|
|
import net.minecraft.text.LiteralText;
|
|
|
|
import net.minecraft.text.Text;
|
|
|
|
import net.minecraft.text.TranslatableText;
|
|
|
|
import net.minecraft.util.ActionResult;
|
|
|
|
import net.minecraft.util.Formatting;
|
|
|
|
import net.minecraft.util.Hand;
|
|
|
|
import net.minecraft.util.Rarity;
|
|
|
|
import net.minecraft.util.TypedActionResult;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
public class TimeDilaterItem extends Item {
|
|
|
|
public enum TimeSpeed {
|
|
|
|
NORMAL,
|
|
|
|
FAST,
|
|
|
|
VERY_FAST
|
|
|
|
}
|
|
|
|
|
|
|
|
public interface DilatedWorld {
|
|
|
|
void setTimeSpeed(TimeSpeed speed);
|
|
|
|
TimeSpeed getTimeSpeed();
|
|
|
|
}
|
|
|
|
|
|
|
|
public TimeDilaterItem() {
|
2020-04-15 22:19:40 +00:00
|
|
|
super(new Settings().group(RelicCraft.ITEM_GROUP).maxDamage(9).rarity(Rarity.UNCOMMON));
|
2020-04-04 02:32:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
|
|
|
|
ItemStack stack = user.getStackInHand(hand);
|
2020-04-15 22:19:40 +00:00
|
|
|
|
|
|
|
user.incrementStat(Stats.USED.getOrCreateStat(this));
|
|
|
|
|
2020-04-04 02:32:34 +00:00
|
|
|
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 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)));
|
|
|
|
RelicCraft.DILATE_TIME_CRITERION.trigger((ServerPlayerEntity) user);
|
|
|
|
}
|
|
|
|
|
|
|
|
RelicCraft.playRelicSound(user);
|
|
|
|
stack.damage(1, user, e -> e.sendToolBreakStatus(hand));
|
2020-04-15 22:19:40 +00:00
|
|
|
|
2020-04-04 02:32:34 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2020-04-08 02:03:06 +00:00
|
|
|
|
|
|
|
public static long getTimeDilationFactor(TimeSpeed speed) {
|
|
|
|
switch (speed) {
|
|
|
|
case FAST: {
|
|
|
|
return 4L;
|
|
|
|
}
|
|
|
|
case VERY_FAST: {
|
|
|
|
return 8L;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
case NORMAL: {
|
|
|
|
return 1L;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-04-04 02:32:34 +00:00
|
|
|
}
|