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 {
name = "HYWLA"
url = "https://maven.tehnut.info/"
content {
includeGroup "mcp.mobius.waila"
}
}
maven {
name = 'Earthcomputer Mods'
@@ -107,8 +109,12 @@ dependencies {
include "alexiil.mc.lib:libblockattributes-items:${libblockattributes_version}"
include "alexiil.mc.lib:libblockattributes-fluids:${libblockattributes_version}"
modCompileOnly "me.shedaniel:RoughlyEnoughItems:4.6.6"
modCompileOnly "mcp.mobius.waila:Hwyla:1.16.1-1.9.22-75"
modCompileOnly("me.shedaniel:RoughlyEnoughItems:5.0.2-unstable") {
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 "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
#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
+10 -4
View File
@@ -217,6 +217,12 @@ public final class AppEngClient extends AppEngBase {
throw new IllegalStateException("No server is currently running.");
}
@Override
public boolean isOnServerThread() {
IntegratedServer server = client.getServer();
return server != null && server.isOnThread();
}
@Override
public Stream<? extends PlayerEntity> getPlayers() {
return Stream.empty();
@@ -243,15 +249,15 @@ public final class AppEngClient extends AppEngBase {
}
@Override
public CableRenderMode getRenderMode() {
public CableRenderMode getCableRenderMode() {
if (Platform.isServer()) {
return super.getRenderMode();
return super.getCableRenderMode();
}
final MinecraftClient mc = MinecraftClient.getInstance();
final PlayerEntity player = mc.player;
return this.renderModeForPlayer(player);
return this.getCableRenderModeForPlayer(player);
}
public void triggerUpdates() {
@@ -271,7 +277,7 @@ public final class AppEngClient extends AppEngBase {
}
@Override
public void updateRenderMode(PlayerEntity player) {
public void setPartInteractionPlayer(PlayerEntity player) {
}
+12 -2
View File
@@ -67,9 +67,14 @@ public interface AppEng {
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);
@@ -81,6 +86,11 @@ public interface AppEng {
*/
MinecraftServer getServer();
/**
* Checks whether the current thread is the main server thread.
*/
boolean isOnServerThread();
//
// private final Registration registration;
//
+18 -12
View File
@@ -152,12 +152,23 @@ import appeng.worldgen.ChargedQuartzOreConfig;
import appeng.worldgen.ChargedQuartzOreFeature;
import appeng.worldgen.meteorite.MeteoriteStructure;
import javax.annotation.Nullable;
public abstract class AppEngBase implements AppEng {
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() {
if (AppEng.instance() != null) {
@@ -423,18 +434,13 @@ public abstract class AppEngBase implements AppEng {
}
@Override
public CableRenderMode getRenderMode() {
if (this.renderModeBased == null) {
return CableRenderMode.STANDARD;
}
return this.renderModeForPlayer(this.renderModeBased);
public CableRenderMode getCableRenderMode() {
return this.getCableRenderModeForPlayer(partInteractionPlayer.get());
}
// FIXME this is some hot shit _FOR WHAT_?
@Override
public void updateRenderMode(final PlayerEntity player) {
this.renderModeBased = player;
public void setPartInteractionPlayer(final PlayerEntity player) {
this.partInteractionPlayer.set(player);
}
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);
}
protected CableRenderMode renderModeForPlayer(final PlayerEntity player) {
protected final CableRenderMode getCableRenderModeForPlayer(@Nullable final PlayerEntity player) {
if (player != null) {
for (int x = 0; x < PlayerInventory.getHotbarSize(); x++) {
final ItemStack is = player.inventory.getStack(x);
+1 -1
View File
@@ -41,6 +41,6 @@ public class ApiPart implements IPartHelper {
@Override
public CableRenderMode getCableRenderMode() {
return AppEng.instance().getRenderMode();
return AppEng.instance().getCableRenderMode();
}
}
@@ -68,11 +68,14 @@ public class PartPlacementPacket extends BasePacket {
@Override
public void serverPacketData(final INetworkInfo manager, final PlayerEntity player) {
final ServerPlayerEntity sender = (ServerPlayerEntity) player;
AppEng.instance().updateRenderMode(sender);
PartPlacement.setEyeHeight(this.eyeHeight);
PartPlacement.place(sender.getStackInHand(this.hand), new BlockPos(this.x, this.y, this.z),
Direction.values()[this.face], sender, this.hand, sender.world,
PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0);
AppEng.instance().updateRenderMode(null);
AppEng.instance().setPartInteractionPlayer(sender);
try {
PartPlacement.setEyeHeight(this.eyeHeight);
PartPlacement.place(sender.getStackInHand(this.hand), new BlockPos(this.x, this.y, this.z),
Direction.values()[this.face], sender, this.hand, sender.world,
PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0);
} 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) {
AppEng.instance().updateRenderMode(player);
final SelectedPart sp = host.selectPart(pos);
AppEng.instance().updateRenderMode(null);
return sp;
AppEng.instance().setPartInteractionPlayer(player);
try {
return host.selectPart(pos);
} finally {
AppEng.instance().setPartInteractionPlayer(null);
}
}
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.server.PlayerStream;
import net.minecraft.client.util.InputUtil;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.hit.HitResult;
import net.minecraft.world.World;
import appeng.api.parts.CableRenderMode;
import appeng.client.ActionKey;
import appeng.client.EffectType;
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
public boolean isActionKey(@Nonnull ActionKey key, int keyCode, int scanCode) {
return false;
@@ -98,4 +86,9 @@ public final class AppEngServer extends AppEngBase {
return server;
}
@Override
public boolean isOnServerThread() {
return server != null && server.isOnThread();
}
}
+54 -47
View File
@@ -18,48 +18,14 @@
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 appeng.api.config.*;
import appeng.api.config.AccessRestriction;
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.IMaterials;
import appeng.api.features.AEFeature;
@@ -86,6 +52,7 @@ import appeng.api.util.DimensionalCoord;
import appeng.core.AEConfig;
import appeng.core.AELog;
import appeng.core.Api;
import appeng.core.AppEng;
import appeng.core.stats.AeStats;
import appeng.fluids.util.AEFluidStack;
import appeng.hooks.TickHandler;
@@ -97,6 +64,50 @@ import appeng.util.helpers.ItemComparisonHelper;
import appeng.util.helpers.P2PHelper;
import appeng.util.item.AEItemStack;
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
@@ -203,10 +214,7 @@ public class Platform {
* returns true if the code is on the client.
*/
public static boolean isClient() {
// FIXME: Move this to the proxy so it will work on a dedicated server
MinecraftClient client = MinecraftClient.getInstance();
IntegratedServer server = client.getServer();
return server == null || Thread.currentThread() != server.getThread();
return !AppEng.instance().isOnServerThread();
}
/*
@@ -647,8 +655,7 @@ public class Platform {
public static LookDirection getPlayerRay(final PlayerEntity playerIn, double reachDistance) {
final double x = playerIn.prevX + (playerIn.getX() - playerIn.prevX);
final double y = playerIn.prevY + (playerIn.getY() - playerIn.prevY)
+ playerIn.getEyeHeight(playerIn.getPose());
final double y = playerIn.prevY + (playerIn.getY() - playerIn.prevY) + playerIn.getStandingEyeHeight();
final double z = playerIn.prevZ + (playerIn.getZ() - playerIn.prevZ);
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 static final StructurePieceType TYPE = StructurePieceType.register(MeteoriteStructurePiece::new, "AE2MTRT");
public static final StructurePieceType TYPE = StructurePieceType.register(MeteoriteStructurePiece::new, "ae2mtrt");
private final PlacedMeteoriteSettings settings;