Fix server-side problems.

This commit is contained in:
Sebastian Hartte
2020-08-02 18:09:21 +02:00
parent 7f7b794c0b
commit 62ac6a0052
11 changed files with 126 additions and 94 deletions
+9 -3
View File
@@ -37,7 +37,9 @@ repositories {
maven { maven {
name = "HYWLA" name = "HYWLA"
url = "https://maven.tehnut.info/" url = "https://maven.tehnut.info/"
content {
includeGroup "mcp.mobius.waila"
}
} }
maven { maven {
name = 'Earthcomputer Mods' name = 'Earthcomputer Mods'
@@ -107,8 +109,12 @@ dependencies {
include "alexiil.mc.lib:libblockattributes-items:${libblockattributes_version}" include "alexiil.mc.lib:libblockattributes-items:${libblockattributes_version}"
include "alexiil.mc.lib:libblockattributes-fluids:${libblockattributes_version}" include "alexiil.mc.lib:libblockattributes-fluids:${libblockattributes_version}"
modCompileOnly "me.shedaniel:RoughlyEnoughItems:4.6.6" modCompileOnly("me.shedaniel:RoughlyEnoughItems:5.0.2-unstable") {
modCompileOnly "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75" exclude group: "net.fabricmc.fabric-api"
}
modCompileOnly("mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75") {
exclude group: "net.fabricmc.fabric-api"
}
// modRuntimeOnly "me.shedaniel:RoughlyEnoughItems:4.6.6" // modRuntimeOnly "me.shedaniel:RoughlyEnoughItems:4.6.6"
// modRuntimeOnly "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75" // modRuntimeOnly "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75"
+1 -1
View File
@@ -14,7 +14,7 @@ yarn_mappings=1.16.2-pre1+build.5
loader_version=0.9.0+build.204 loader_version=0.9.0+build.204
#Fabric api #Fabric api
fabric_version=0.16.1+build.387-1.16 fabric_version=0.16.3+build.390-1.16
loom_version=0.4-SNAPSHOT loom_version=0.4-SNAPSHOT
+10 -4
View File
@@ -217,6 +217,12 @@ public final class AppEngClient extends AppEngBase {
throw new IllegalStateException("No server is currently running."); throw new IllegalStateException("No server is currently running.");
} }
@Override
public boolean isOnServerThread() {
IntegratedServer server = client.getServer();
return server != null && server.isOnThread();
}
@Override @Override
public Stream<? extends PlayerEntity> getPlayers() { public Stream<? extends PlayerEntity> getPlayers() {
return Stream.empty(); return Stream.empty();
@@ -243,15 +249,15 @@ public final class AppEngClient extends AppEngBase {
} }
@Override @Override
public CableRenderMode getRenderMode() { public CableRenderMode getCableRenderMode() {
if (Platform.isServer()) { if (Platform.isServer()) {
return super.getRenderMode(); return super.getCableRenderMode();
} }
final MinecraftClient mc = MinecraftClient.getInstance(); final MinecraftClient mc = MinecraftClient.getInstance();
final PlayerEntity player = mc.player; final PlayerEntity player = mc.player;
return this.renderModeForPlayer(player); return this.getCableRenderModeForPlayer(player);
} }
public void triggerUpdates() { public void triggerUpdates() {
@@ -271,7 +277,7 @@ public final class AppEngClient extends AppEngBase {
} }
@Override @Override
public void updateRenderMode(PlayerEntity player) { public void setPartInteractionPlayer(PlayerEntity player) {
} }
+12 -2
View File
@@ -67,9 +67,14 @@ public interface AppEng {
void postInit(); void postInit();
CableRenderMode getRenderMode(); CableRenderMode getCableRenderMode();
void updateRenderMode(PlayerEntity player); /**
* Sets the player that is currently interacting with a cable or part attached to a cable. This will return that
* player's cable render mode from calls to {@link #getCableRenderMode()}, until another player or null is set.
* @param player Null to revert to the default cable render mode.
*/
void setPartInteractionPlayer(PlayerEntity player);
boolean isActionKey(@Nonnull final ActionKey key, int keyCode, int scanCode); boolean isActionKey(@Nonnull final ActionKey key, int keyCode, int scanCode);
@@ -81,6 +86,11 @@ public interface AppEng {
*/ */
MinecraftServer getServer(); MinecraftServer getServer();
/**
* Checks whether the current thread is the main server thread.
*/
boolean isOnServerThread();
// //
// private final Registration registration; // private final Registration registration;
// //
+18 -12
View File
@@ -152,12 +152,23 @@ import appeng.worldgen.ChargedQuartzOreConfig;
import appeng.worldgen.ChargedQuartzOreFeature; import appeng.worldgen.ChargedQuartzOreFeature;
import appeng.worldgen.meteorite.MeteoriteStructure; import appeng.worldgen.meteorite.MeteoriteStructure;
import javax.annotation.Nullable;
public abstract class AppEngBase implements AppEng { public abstract class AppEngBase implements AppEng {
protected AdvancementTriggers advancementTriggers; protected AdvancementTriggers advancementTriggers;
// WTF is this doing? Should this be a ThreadLocal??? /**
private PlayerEntity renderModeBased; * While we process a player-specific part placement/cable interaction packet,
* we need to use that player's transparent-facade mode to understand whether
* the player can see through facades or not.
* <p>
* We need to use this method since the collision shape methods do not know
* about the player that the shape is being requested for, so they will call
* {@link #getCableRenderMode()} below, which then will use this field to figure
* out which player it's for.
*/
private final ThreadLocal<PlayerEntity> partInteractionPlayer = new ThreadLocal<>();
public AppEngBase() { public AppEngBase() {
if (AppEng.instance() != null) { if (AppEng.instance() != null) {
@@ -423,18 +434,13 @@ public abstract class AppEngBase implements AppEng {
} }
@Override @Override
public CableRenderMode getRenderMode() { public CableRenderMode getCableRenderMode() {
if (this.renderModeBased == null) { return this.getCableRenderModeForPlayer(partInteractionPlayer.get());
return CableRenderMode.STANDARD;
} }
return this.renderModeForPlayer(this.renderModeBased);
}
// FIXME this is some hot shit _FOR WHAT_?
@Override @Override
public void updateRenderMode(final PlayerEntity player) { public void setPartInteractionPlayer(final PlayerEntity player) {
this.renderModeBased = player; this.partInteractionPlayer.set(player);
} }
protected final <T extends IBootstrapComponent> void callDeferredBootstrapComponents(Class<T> componentClass, protected final <T extends IBootstrapComponent> void callDeferredBootstrapComponents(Class<T> componentClass,
@@ -443,7 +449,7 @@ public abstract class AppEngBase implements AppEng {
definitions.getRegistry().getBootstrapComponents(componentClass).forEachRemaining(invoker); definitions.getRegistry().getBootstrapComponents(componentClass).forEachRemaining(invoker);
} }
protected CableRenderMode renderModeForPlayer(final PlayerEntity player) { protected final CableRenderMode getCableRenderModeForPlayer(@Nullable final PlayerEntity player) {
if (player != null) { if (player != null) {
for (int x = 0; x < PlayerInventory.getHotbarSize(); x++) { for (int x = 0; x < PlayerInventory.getHotbarSize(); x++) {
final ItemStack is = player.inventory.getStack(x); final ItemStack is = player.inventory.getStack(x);
+1 -1
View File
@@ -41,6 +41,6 @@ public class ApiPart implements IPartHelper {
@Override @Override
public CableRenderMode getCableRenderMode() { public CableRenderMode getCableRenderMode() {
return AppEng.instance().getRenderMode(); return AppEng.instance().getCableRenderMode();
} }
} }
@@ -68,11 +68,14 @@ public class PartPlacementPacket extends BasePacket {
@Override @Override
public void serverPacketData(final INetworkInfo manager, final PlayerEntity player) { public void serverPacketData(final INetworkInfo manager, final PlayerEntity player) {
final ServerPlayerEntity sender = (ServerPlayerEntity) player; final ServerPlayerEntity sender = (ServerPlayerEntity) player;
AppEng.instance().updateRenderMode(sender); AppEng.instance().setPartInteractionPlayer(sender);
try {
PartPlacement.setEyeHeight(this.eyeHeight); PartPlacement.setEyeHeight(this.eyeHeight);
PartPlacement.place(sender.getStackInHand(this.hand), new BlockPos(this.x, this.y, this.z), PartPlacement.place(sender.getStackInHand(this.hand), new BlockPos(this.x, this.y, this.z),
Direction.values()[this.face], sender, this.hand, sender.world, Direction.values()[this.face], sender, this.hand, sender.world,
PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0); PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0);
AppEng.instance().updateRenderMode(null); } finally {
AppEng.instance().setPartInteractionPlayer(null);
}
} }
} }
@@ -316,11 +316,12 @@ public class PartPlacement {
} }
private static SelectedPart selectPart(final PlayerEntity player, final IPartHost host, final Vec3d pos) { private static SelectedPart selectPart(final PlayerEntity player, final IPartHost host, final Vec3d pos) {
AppEng.instance().updateRenderMode(player); AppEng.instance().setPartInteractionPlayer(player);
final SelectedPart sp = host.selectPart(pos); try {
AppEng.instance().updateRenderMode(null); return host.selectPart(pos);
} finally {
return sp; AppEng.instance().setPartInteractionPlayer(null);
}
} }
public static IFacadePart isFacade(final ItemStack held, final AEPartLocation side) { public static IFacadePart isFacade(final ItemStack held, final AEPartLocation side) {
+5 -12
View File
@@ -7,13 +7,11 @@ import javax.annotation.Nonnull;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.server.PlayerStream; import net.fabricmc.fabric.api.server.PlayerStream;
import net.minecraft.client.util.InputUtil;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World; import net.minecraft.world.World;
import appeng.api.parts.CableRenderMode;
import appeng.client.ActionKey; import appeng.client.ActionKey;
import appeng.client.EffectType; import appeng.client.EffectType;
import appeng.core.AppEngBase; import appeng.core.AppEngBase;
@@ -78,16 +76,6 @@ public final class AppEngServer extends AppEngBase {
} }
@Override
public CableRenderMode getRenderMode() {
return null;
}
@Override
public void updateRenderMode(PlayerEntity player) {
}
@Override @Override
public boolean isActionKey(@Nonnull ActionKey key, int keyCode, int scanCode) { public boolean isActionKey(@Nonnull ActionKey key, int keyCode, int scanCode) {
return false; return false;
@@ -98,4 +86,9 @@ public final class AppEngServer extends AppEngBase {
return server; return server;
} }
@Override
public boolean isOnServerThread() {
return server != null && server.isOnThread();
}
} }
+54 -47
View File
@@ -18,48 +18,14 @@
package appeng.util; package appeng.util;
import java.text.DecimalFormat;
import java.util.*;
import javax.annotation.Nullable;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.Recipe;
import net.minecraft.server.integrated.IntegratedServer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.*;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.RayTraceContext;
import net.minecraft.world.World;
import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume;
import appeng.api.config.AccessRestriction;
import appeng.api.config.*; import appeng.api.config.Actionable;
import appeng.api.config.PowerMultiplier;
import appeng.api.config.PowerUnits;
import appeng.api.config.SearchBoxMode;
import appeng.api.config.SecurityPermissions;
import appeng.api.config.SortOrder;
import appeng.api.definitions.IItemDefinition; import appeng.api.definitions.IItemDefinition;
import appeng.api.definitions.IMaterials; import appeng.api.definitions.IMaterials;
import appeng.api.features.AEFeature; import appeng.api.features.AEFeature;
@@ -86,6 +52,7 @@ import appeng.api.util.DimensionalCoord;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.core.Api; import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.stats.AeStats; import appeng.core.stats.AeStats;
import appeng.fluids.util.AEFluidStack; import appeng.fluids.util.AEFluidStack;
import appeng.hooks.TickHandler; import appeng.hooks.TickHandler;
@@ -97,6 +64,50 @@ import appeng.util.helpers.ItemComparisonHelper;
import appeng.util.helpers.P2PHelper; import appeng.util.helpers.P2PHelper;
import appeng.util.item.AEItemStack; import appeng.util.item.AEItemStack;
import appeng.util.prioritylist.IPartitionList; import appeng.util.prioritylist.IPartitionList;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.CraftingInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.recipe.Recipe;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.hit.EntityHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.RayTraceContext;
import net.minecraft.world.World;
import javax.annotation.Nullable;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/** /**
* @author AlgorithmX2 * @author AlgorithmX2
@@ -203,10 +214,7 @@ public class Platform {
* returns true if the code is on the client. * returns true if the code is on the client.
*/ */
public static boolean isClient() { public static boolean isClient() {
// FIXME: Move this to the proxy so it will work on a dedicated server return !AppEng.instance().isOnServerThread();
MinecraftClient client = MinecraftClient.getInstance();
IntegratedServer server = client.getServer();
return server == null || Thread.currentThread() != server.getThread();
} }
/* /*
@@ -647,8 +655,7 @@ public class Platform {
public static LookDirection getPlayerRay(final PlayerEntity playerIn, double reachDistance) { public static LookDirection getPlayerRay(final PlayerEntity playerIn, double reachDistance) {
final double x = playerIn.prevX + (playerIn.getX() - playerIn.prevX); final double x = playerIn.prevX + (playerIn.getX() - playerIn.prevX);
final double y = playerIn.prevY + (playerIn.getY() - playerIn.prevY) final double y = playerIn.prevY + (playerIn.getY() - playerIn.prevY) + playerIn.getStandingEyeHeight();
+ playerIn.getEyeHeight(playerIn.getPose());
final double z = playerIn.prevZ + (playerIn.getZ() - playerIn.prevZ); final double z = playerIn.prevZ + (playerIn.getZ() - playerIn.prevZ);
final float playerPitch = playerIn.prevPitch + (playerIn.pitch - playerIn.prevPitch); final float playerPitch = playerIn.prevPitch + (playerIn.pitch - playerIn.prevPitch);
@@ -35,7 +35,7 @@ import appeng.worldgen.meteorite.fallout.FalloutMode;
public class MeteoriteStructurePiece extends StructurePiece { public class MeteoriteStructurePiece extends StructurePiece {
public static final StructurePieceType TYPE = StructurePieceType.register(MeteoriteStructurePiece::new, "AE2MTRT"); public static final StructurePieceType TYPE = StructurePieceType.register(MeteoriteStructurePiece::new, "ae2mtrt");
private final PlacedMeteoriteSettings settings; private final PlacedMeteoriteSettings settings;