Improve drive testcode

This commit is contained in:
DBotThePony 2021-08-26 10:41:48 +07:00
parent e7e12bed8c
commit 2166119a75
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 105 additions and 41 deletions

View File

@ -16,6 +16,7 @@ import ru.dbotthepony.mc.otm.capability.AndroidCapability;
import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer; import ru.dbotthepony.mc.otm.capability.AndroidCapabilityPlayer;
import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.capability.drive.DrivePool; import ru.dbotthepony.mc.otm.capability.drive.DrivePool;
import ru.dbotthepony.mc.otm.capability.drive.MatteryDrive;
import ru.dbotthepony.mc.otm.client.AndroidGui; import ru.dbotthepony.mc.otm.client.AndroidGui;
import ru.dbotthepony.mc.otm.client.EventHandler; import ru.dbotthepony.mc.otm.client.EventHandler;
import ru.dbotthepony.mc.otm.item.ItemPortableCondensationDrive; import ru.dbotthepony.mc.otm.item.ItemPortableCondensationDrive;
@ -23,6 +24,7 @@ import ru.dbotthepony.mc.otm.matter.MatterGrid;
import ru.dbotthepony.mc.otm.matter.MatterRegistry; import ru.dbotthepony.mc.otm.matter.MatterRegistry;
import ru.dbotthepony.mc.otm.network.MatteryNetworking; import ru.dbotthepony.mc.otm.network.MatteryNetworking;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
// The value here should match an entry in the META-INF/mods.toml file // The value here should match an entry in the META-INF/mods.toml file
@ -77,6 +79,8 @@ public class OverdriveThatMatters {
}; };
} }
private static MatteryDrive drive;
private void setup(final FMLCommonSetupEvent event) { private void setup(final FMLCommonSetupEvent event) {
// some preinit code // some preinit code
MatteryCapability.register(); MatteryCapability.register();

View File

@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fmlserverevents.FMLServerStartedEvent; import net.minecraftforge.fmlserverevents.FMLServerStartedEvent;
import net.minecraftforge.fmlserverevents.FMLServerStoppingEvent; import net.minecraftforge.fmlserverevents.FMLServerStoppingEvent;
@ -48,8 +49,6 @@ public class DrivePool {
public final UUID id; public final UUID id;
public final IMatteryDrive drive; public final IMatteryDrive drive;
public long last_access = System.currentTimeMillis(); public long last_access = System.currentTimeMillis();
public long soft_sync_on = last_access + 8_000; // soft sync in 4 seconds
public long hard_sync_on = last_access + 30_000; // hard sync in 4 seconds
Entry(UUID id, IMatteryDrive drive) { Entry(UUID id, IMatteryDrive drive) {
this.id = id; this.id = id;
@ -57,31 +56,19 @@ public class DrivePool {
} }
@Nullable @Nullable
public CompoundTag sync(boolean force) { public CompoundTag sync() {
if (!drive.isDirty()) { if (!drive.isDirty()) {
soft_sync_on = System.currentTimeMillis() + 8_000;
hard_sync_on = System.currentTimeMillis() + 30_000;
next_save = Math.min(next_save, soft_sync_on);
return null; return null;
} }
if (force || hard_sync_on <= System.currentTimeMillis() || soft_sync_on <= System.currentTimeMillis()) { var tag = drive.serializeNBT();
var tag = drive.serializeNBT(); drive.markClean();
drive.markClean(); last_access = System.currentTimeMillis();
soft_sync_on = System.currentTimeMillis() + 8_000; return tag;
hard_sync_on = System.currentTimeMillis() + 30_000;
next_save = Math.min(next_save, soft_sync_on);
last_access = System.currentTimeMillis();
return tag;
}
return null;
} }
public IMatteryDrive access() { public IMatteryDrive access() {
last_access = System.currentTimeMillis(); last_access = System.currentTimeMillis();
soft_sync_on = last_access + 8_000;
next_save = Math.min(hard_sync_on, Math.min(next_save, soft_sync_on));
return drive; return drive;
} }
} }
@ -92,8 +79,6 @@ public class DrivePool {
private static ReportedException exception; private static ReportedException exception;
public static final String DATA_PATH = "data/otm_drives"; public static final String DATA_PATH = "data/otm_drives";
private static long next_save = Long.MAX_VALUE;
public static <T extends IMatteryDrive> T get(UUID id, Function<CompoundTag, T> factory_stored, Supplier<T> factory_empty) { public static <T extends IMatteryDrive> T get(UUID id, Function<CompoundTag, T> factory_stored, Supplier<T> factory_empty) {
var get = pool.get(id); var get = pool.get(id);
@ -159,16 +144,13 @@ public class DrivePool {
if (exception != null) { if (exception != null) {
throw exception; throw exception;
} }
//if (next_save < System.currentTimeMillis()) {
writeBacklog(true);
//}
} }
} }
@SubscribeEvent @SubscribeEvent
public static void serverStartEvent(FMLServerStartedEvent event) { public static void serverStartEvent(FMLServerStartedEvent event) {
if (thread != null && thread.isAlive()) { if (thread != null && thread.isAlive()) {
LOGGER.error("FMLServerStartedEvent fired twice.");
LOGGER.error("Attempting to start another DrivePool I/O thread when already running one!"); LOGGER.error("Attempting to start another DrivePool I/O thread when already running one!");
return; return;
} }
@ -179,7 +161,7 @@ public class DrivePool {
base_directory = new File(server.storageSource.getWorldDir().toFile(), DATA_PATH); base_directory = new File(server.storageSource.getWorldDir().toFile(), DATA_PATH);
base_directory.mkdirs(); base_directory.mkdirs();
thread = new Thread(null, () -> DrivePool.thread(server), "Overdrive That Matters DrivePool I/O"); thread = new Thread(null, () -> DrivePool.thread(server), "Overdrive That Matters DrivePool IO");
thread.start(); thread.start();
} }
@ -190,21 +172,28 @@ public class DrivePool {
LockSupport.unpark(thread); LockSupport.unpark(thread);
} }
writeBacklog(true); if (exception == null) {
sync(); writeBacklog();
sync();
}
pool.clear(); pool.clear();
} }
public static void writeBacklog(boolean force) { @SubscribeEvent
public static void onWorldSave(WorldEvent.Save event) {
writeBacklog();
}
public static void writeBacklog() {
var sync_required = false; var sync_required = false;
ArrayList<UUID> remove_keys = null; ArrayList<UUID> remove_keys = null;
for (var entry : pool.entrySet()) { for (var entry : pool.entrySet()) {
var tag = entry.getValue().sync(force); var tag = entry.getValue().sync();
if (tag != null) { if (tag != null) {
LOGGER.info("Syncing {}", entry.getKey()); LOGGER.info("Serializing OTM Drive {}", entry.getKey());
var index = backlog.indexOf(entry.getKey()); var index = backlog.indexOf(entry.getKey());
@ -233,10 +222,6 @@ public class DrivePool {
if (sync_required) { if (sync_required) {
LockSupport.unpark(thread); LockSupport.unpark(thread);
} }
if (pool.size() == 0) {
next_save = Long.MAX_VALUE;
}
} }
public static void sync() { public static void sync() {
@ -245,8 +230,23 @@ public class DrivePool {
for (var entry : copy) { for (var entry : copy) {
try { try {
var file = new File(base_directory, entry.file.toString() + ".dat"); LOGGER.info("Syncing OTM Drive {}", entry.file);
LOGGER.info("Writing {}", entry.file); var old_file = new File(base_directory, entry.file + ".dat_old");
if (old_file.exists()) {
if (!old_file.delete()) {
throw new IllegalStateException("Unable to delete old dat file");
}
}
var file = new File(base_directory, entry.file + ".dat");
if (file.exists()) {
if (!file.renameTo(old_file)) {
throw new IllegalStateException("Unable to move old dat file");
}
}
NbtIo.writeCompressed(entry.tag, file); NbtIo.writeCompressed(entry.tag, file);
} catch(Throwable error) { } catch(Throwable error) {
var report = new CrashReport("Syncing OTM Drives state to disk", error); var report = new CrashReport("Syncing OTM Drives state to disk", error);

View File

@ -42,7 +42,12 @@ public interface IMatteryDrive {
ItemStack insertItem(@Nonnull ItemStack item, boolean simulate); ItemStack insertItem(@Nonnull ItemStack item, boolean simulate);
@Nonnull @Nonnull
ItemStack extractItem(@Nonnull UUID id, int amount, boolean simulate); default ItemStack extractItem(@Nonnull UUID id, int amount, boolean simulate) {
return extractItem(id, amount, true, simulate);
}
@Nonnull
ItemStack extractItem(@Nonnull UUID id, int amount, boolean obey_stack_size, boolean simulate);
// not extending INBTSerializable to avoid serializing it as forgecaps // not extending INBTSerializable to avoid serializing it as forgecaps
CompoundTag serializeNBT(); CompoundTag serializeNBT();

View File

@ -106,10 +106,12 @@ public class MatteryDrive implements IMatteryDrive {
} }
var build_list = new ArrayList<StoredStack>(amount); var build_list = new ArrayList<StoredStack>(amount);
var i = 0;
for (var _stack : list) { for (var _stack : list) {
if (ItemStack.tagMatches(_stack.stack(), stack)) { if (ItemStack.tagMatches(_stack.stack(), stack)) {
build_list.add(_stack); build_list.set(i, _stack);
i++;
} }
} }
@ -167,7 +169,7 @@ public class MatteryDrive implements IMatteryDrive {
@Nonnull @Nonnull
@Override @Override
public ItemStack extractItem(@Nonnull UUID id, int amount, boolean simulate) { public ItemStack extractItem(@Nonnull UUID id, int amount, boolean obey_stack_size, boolean simulate) {
var get = items_uuid.get(id); var get = items_uuid.get(id);
if (get == null) if (get == null)
@ -175,6 +177,9 @@ public class MatteryDrive implements IMatteryDrive {
var extract = Math.min(amount, get.stack().getCount()); var extract = Math.min(amount, get.stack().getCount());
if (obey_stack_size)
extract = Math.min(extract, get.stack().getItem().getItemStackLimit(get.stack()));
if (extract <= 0) if (extract <= 0)
return ItemStack.EMPTY; return ItemStack.EMPTY;

View File

@ -1,15 +1,22 @@
package ru.dbotthepony.mc.otm.item; package ru.dbotthepony.mc.otm.item;
import net.minecraft.ChatFormatting;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.stats.Stats;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.capability.MatteryCapability;
@ -19,6 +26,7 @@ import ru.dbotthepony.mc.otm.capability.drive.MatteryDrive;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List;
import java.util.UUID; import java.util.UUID;
public class ItemPortableCondensationDrive extends Item { public class ItemPortableCondensationDrive extends Item {
@ -28,21 +36,48 @@ public class ItemPortableCondensationDrive extends Item {
@SubscribeEvent @SubscribeEvent
public static void onPickupEvent(EntityItemPickupEvent event) { public static void onPickupEvent(EntityItemPickupEvent event) {
if (
event.getItem().getOwner() != null &&
!event.getItem().getOwner().equals(event.getPlayer().getUUID()) &&
event.getItem().getAge() < 200
) {
return;
}
var amount = event.getItem().getItem().getCount();
var item = event.getItem().getItem().getItem();
for (var stack : event.getPlayer().getInventory().items) { for (var stack : event.getPlayer().getInventory().items) {
if (stack.getItem() instanceof ItemPortableCondensationDrive) { if (stack.getItem() instanceof ItemPortableCondensationDrive) {
var cap = stack.getCapability(MatteryCapability.DRIVE).resolve().get(); var cap = stack.getCapability(MatteryCapability.DRIVE).resolve().get();
var copy = event.getItem().getItem().copy();
var remaining = cap.insertItem(event.getItem().getItem(), false); var remaining = cap.insertItem(event.getItem().getItem(), false);
if (remaining.getCount() == event.getItem().getItem().getCount()) { if (remaining.getCount() == event.getItem().getItem().getCount()) {
continue; continue;
} }
copy.setCount(copy.getCount() - remaining.getCount());
event.setCanceled(true); event.setCanceled(true);
net.minecraftforge.fmllegacy.hooks.BasicEventHooks.firePlayerItemPickupEvent(event.getPlayer(), event.getItem(), copy);
if (remaining.getCount() > 0) { if (remaining.getCount() > 0) {
event.getItem().getItem().setCount(remaining.getCount()); event.getItem().getItem().setCount(remaining.getCount());
event.getPlayer().take(event.getItem(), amount - remaining.getCount());
event.getPlayer().awardStat(Stats.ITEM_PICKED_UP.get(item), amount - remaining.getCount());
event.getPlayer().onItemPickup(event.getItem());
amount = remaining.getCount();
} else { } else {
event.getPlayer().take(event.getItem(), amount);
event.getPlayer().awardStat(Stats.ITEM_PICKED_UP.get(item), amount);
event.getPlayer().onItemPickup(event.getItem());
event.getItem().discard(); event.getItem().discard();
return; return;
} }
@ -87,6 +122,19 @@ public class ItemPortableCondensationDrive extends Item {
} }
} }
@Override
public void appendHoverText(ItemStack stack, @Nullable Level p_41422_, List<Component> p_41423_, TooltipFlag p_41424_) {
super.appendHoverText(stack, p_41422_, p_41423_, p_41424_);
if (stack.getTag() != null) {
var uuid = stack.getTag().getLongArray("uuid");
if (uuid.length == 2) {
p_41423_.add(new TextComponent(new UUID(uuid[0], uuid[1]).toString()).withStyle(ChatFormatting.GRAY));
}
}
}
@Nullable @Nullable
@Override @Override
public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { public ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) {

View File

@ -129,7 +129,9 @@
"item.overdrive_that_matters.pill_android": "Android pill", "item.overdrive_that_matters.pill_android": "Android pill",
"item.overdrive_that_matters.pill_humane": "Humane pill", "item.overdrive_that_matters.pill_humane": "Humane pill",
"item.overdrive_that_matters.portable_condensation_drive": "Portable condensation drive",
"item.overdrive_that_matters.nutrient_paste": "Nutrient paste", "item.overdrive_that_matters.nutrient_paste": "Nutrient paste",
"item.overdrive_that_matters.battery_crude": "Crude Battery", "item.overdrive_that_matters.battery_crude": "Crude Battery",