Use custom FakePlayer for converting Zombie Villagers
This commit is contained in:
parent
b70608b030
commit
cb41ac679d
7 changed files with 28 additions and 21 deletions
|
@ -27,8 +27,8 @@ public class ContraptionHandler {
|
||||||
static WorldAttached<List<AbstractContraptionEntity>> queuedAdditions;
|
static WorldAttached<List<AbstractContraptionEntity>> queuedAdditions;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
loadedContraptions = new WorldAttached<>(HashMap::new);
|
loadedContraptions = new WorldAttached<>($ -> new HashMap<>());
|
||||||
queuedAdditions = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
queuedAdditions = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void tick(World world) {
|
public static void tick(World world) {
|
||||||
|
|
|
@ -80,10 +80,10 @@ public class CapabilityMinecartController implements ICapabilitySerializable<Com
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
loadedMinecartsByUUID = new WorldAttached<>(HashMap::new);
|
loadedMinecartsByUUID = new WorldAttached<>($ -> new HashMap<>());
|
||||||
loadedMinecartsWithCoupling = new WorldAttached<>(HashSet::new);
|
loadedMinecartsWithCoupling = new WorldAttached<>($ -> new HashSet<>());
|
||||||
queuedAdditions = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
queuedAdditions = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
||||||
queuedUnloads = new WorldAttached<>(() -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
queuedUnloads = new WorldAttached<>($ -> ObjectLists.synchronize(new ObjectArrayList<>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void tick(World world) {
|
public static void tick(World world) {
|
||||||
|
@ -99,16 +99,16 @@ public class CapabilityMinecartController implements ICapabilitySerializable<Com
|
||||||
|
|
||||||
for (AbstractMinecartEntity cart : queued) {
|
for (AbstractMinecartEntity cart : queued) {
|
||||||
UUID uniqueID = cart.getUniqueID();
|
UUID uniqueID = cart.getUniqueID();
|
||||||
|
|
||||||
if (world.isRemote && carts.containsKey(uniqueID)) {
|
if (world.isRemote && carts.containsKey(uniqueID)) {
|
||||||
MinecartController minecartController = carts.get(uniqueID);
|
MinecartController minecartController = carts.get(uniqueID);
|
||||||
if (minecartController != null) {
|
if (minecartController != null) {
|
||||||
AbstractMinecartEntity minecartEntity = minecartController.cart();
|
AbstractMinecartEntity minecartEntity = minecartController.cart();
|
||||||
if (minecartEntity != null && minecartEntity.getEntityId() != cart.getEntityId())
|
if (minecartEntity != null && minecartEntity.getEntityId() != cart.getEntityId())
|
||||||
continue; // Away with you, Fake Entities!
|
continue; // Away with you, Fake Entities!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cartsWithCoupling.remove(uniqueID);
|
cartsWithCoupling.remove(uniqueID);
|
||||||
|
|
||||||
LazyOptional<MinecartController> capability = cart.getCapability(MINECART_CONTROLLER_CAPABILITY);
|
LazyOptional<MinecartController> capability = cart.getCapability(MINECART_CONTROLLER_CAPABILITY);
|
||||||
|
|
|
@ -131,7 +131,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
|
||||||
sendUpdate |= connection.manageFlows(world, pos, internalFluid, extractionPredicate);
|
sendUpdate |= connection.manageFlows(world, pos, internalFluid, extractionPredicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sendUpdate)
|
if (sendUpdate)
|
||||||
tileEntity.notifyUpdate();
|
tileEntity.notifyUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,7 +272,7 @@ public abstract class FluidTransportBehaviour extends TileEntityBehaviour {
|
||||||
// for switching TEs, but retaining flows
|
// for switching TEs, but retaining flows
|
||||||
|
|
||||||
public static final WorldAttached<Map<BlockPos, Map<Direction, PipeConnection>>> interfaceTransfer =
|
public static final WorldAttached<Map<BlockPos, Map<Direction, PipeConnection>>> interfaceTransfer =
|
||||||
new WorldAttached<>(HashMap::new);
|
new WorldAttached<>($ -> new HashMap<>());
|
||||||
|
|
||||||
public static void cacheFlows(IWorld world, BlockPos pos) {
|
public static void cacheFlows(IWorld world, BlockPos pos) {
|
||||||
FluidTransportBehaviour pipe = TileEntityBehaviour.get(world, pos, FluidTransportBehaviour.TYPE);
|
FluidTransportBehaviour pipe = TileEntityBehaviour.get(world, pos, FluidTransportBehaviour.TYPE);
|
||||||
|
|
|
@ -3,12 +3,15 @@ package com.simibubi.create.content.curiosities.weapons;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.function.BiPredicate;
|
import java.util.function.BiPredicate;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import com.mojang.authlib.GameProfile;
|
||||||
import com.mojang.datafixers.util.Pair;
|
import com.mojang.datafixers.util.Pair;
|
||||||
import com.simibubi.create.AllItems;
|
import com.simibubi.create.AllItems;
|
||||||
import com.simibubi.create.Create;
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.foundation.utility.WorldAttached;
|
||||||
|
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
|
@ -18,7 +21,6 @@ import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.item.FallingBlockEntity;
|
import net.minecraft.entity.item.FallingBlockEntity;
|
||||||
import net.minecraft.entity.monster.ZombieVillagerEntity;
|
import net.minecraft.entity.monster.ZombieVillagerEntity;
|
||||||
import net.minecraft.entity.passive.FoxEntity;
|
import net.minecraft.entity.passive.FoxEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
|
||||||
import net.minecraft.item.Food;
|
import net.minecraft.item.Food;
|
||||||
import net.minecraft.item.Foods;
|
import net.minecraft.item.Foods;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
@ -43,11 +45,16 @@ import net.minecraft.world.IWorld;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.server.ServerWorld;
|
import net.minecraft.world.server.ServerWorld;
|
||||||
import net.minecraftforge.common.IPlantable;
|
import net.minecraftforge.common.IPlantable;
|
||||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
import net.minecraftforge.common.util.FakePlayer;
|
||||||
import net.minecraftforge.registries.IRegistryDelegate;
|
import net.minecraftforge.registries.IRegistryDelegate;
|
||||||
|
|
||||||
public class PotatoCannonProjectileTypes {
|
public class PotatoCannonProjectileTypes {
|
||||||
|
|
||||||
|
private static final GameProfile ZOMBIE_CONVERTER_NAME =
|
||||||
|
new GameProfile(UUID.fromString("be12d3dc-27d3-4992-8c97-66be53fd49c5"), "Converter");
|
||||||
|
private static final WorldAttached<FakePlayer> ZOMBIE_CONVERTERS =
|
||||||
|
new WorldAttached<>(w -> new FakePlayer((ServerWorld) w, ZOMBIE_CONVERTER_NAME));
|
||||||
|
|
||||||
public static final Map<ResourceLocation, PotatoCannonProjectileTypes> ALL = new HashMap<>();
|
public static final Map<ResourceLocation, PotatoCannonProjectileTypes> ALL = new HashMap<>();
|
||||||
public static final Map<IRegistryDelegate<Item>, PotatoCannonProjectileTypes> ITEM_MAP = new HashMap<>();
|
public static final Map<IRegistryDelegate<Item>, PotatoCannonProjectileTypes> ITEM_MAP = new HashMap<>();
|
||||||
public static final PotatoCannonProjectileTypes
|
public static final PotatoCannonProjectileTypes
|
||||||
|
@ -155,8 +162,8 @@ public class PotatoCannonProjectileTypes {
|
||||||
if (world.isRemote)
|
if (world.isRemote)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
PlayerEntity dummy = FakePlayerFactory.getMinecraft((ServerWorld) world);
|
FakePlayer dummy = ZOMBIE_CONVERTERS.get(world);
|
||||||
dummy.setHeldItem(Hand.MAIN_HAND, new ItemStack(Items.GOLDEN_APPLE));
|
dummy.setHeldItem(Hand.MAIN_HAND, new ItemStack(Items.GOLDEN_APPLE, 1));
|
||||||
((ZombieVillagerEntity) entity).interactMob(dummy, Hand.MAIN_HAND);
|
((ZombieVillagerEntity) entity).interactMob(dummy, Hand.MAIN_HAND);
|
||||||
return true;
|
return true;
|
||||||
})
|
})
|
||||||
|
|
|
@ -24,7 +24,7 @@ import net.minecraft.world.IWorld;
|
||||||
public class LinkedControllerServerHandler {
|
public class LinkedControllerServerHandler {
|
||||||
|
|
||||||
public static WorldAttached<Map<UUID, Collection<ManualFrequencyEntry>>> receivedInputs =
|
public static WorldAttached<Map<UUID, Collection<ManualFrequencyEntry>>> receivedInputs =
|
||||||
new WorldAttached<>(HashMap::new);
|
new WorldAttached<>($ -> new HashMap<>());
|
||||||
static final int TIMEOUT = 30;
|
static final int TIMEOUT = 30;
|
||||||
|
|
||||||
public static void tick(IWorld world) {
|
public static void tick(IWorld world) {
|
||||||
|
|
|
@ -23,7 +23,7 @@ public class SchematicInstances {
|
||||||
public static WorldAttached<Cache<Integer, SchematicWorld>> loadedSchematics;
|
public static WorldAttached<Cache<Integer, SchematicWorld>> loadedSchematics;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
loadedSchematics = new WorldAttached<>(() -> CacheBuilder.newBuilder()
|
loadedSchematics = new WorldAttached<>($ -> CacheBuilder.newBuilder()
|
||||||
.expireAfterAccess(5, TimeUnit.MINUTES)
|
.expireAfterAccess(5, TimeUnit.MINUTES)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@ public class WorldAttached<T> {
|
||||||
|
|
||||||
static List<Map<IWorld, ?>> allMaps = new ArrayList<>();
|
static List<Map<IWorld, ?>> allMaps = new ArrayList<>();
|
||||||
Map<IWorld, T> attached;
|
Map<IWorld, T> attached;
|
||||||
private Supplier<T> factory;
|
private Function<IWorld, T> factory;
|
||||||
|
|
||||||
public WorldAttached(Supplier<T> factory) {
|
public WorldAttached(Function<IWorld, T> factory) {
|
||||||
this.factory = factory;
|
this.factory = factory;
|
||||||
attached = new HashMap<>();
|
attached = new HashMap<>();
|
||||||
allMaps.add(attached);
|
allMaps.add(attached);
|
||||||
|
@ -31,7 +31,7 @@ public class WorldAttached<T> {
|
||||||
T t = attached.get(world);
|
T t = attached.get(world);
|
||||||
if (t != null)
|
if (t != null)
|
||||||
return t;
|
return t;
|
||||||
T entry = factory.get();
|
T entry = factory.apply(world);
|
||||||
put(world, entry);
|
put(world, entry);
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue