Skip to content

Commit 7a5d7ae

Browse files
committed
Fix players being set on fire after teleporting
1 parent 1696e85 commit 7a5d7ae

File tree

5 files changed

+287
-2
lines changed

5 files changed

+287
-2
lines changed

build.gradle

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ buildscript {
22
repositories {
33
jcenter()
44
maven { url = "http://files.minecraftforge.net/maven" }
5+
maven { url = "http://repo.spongepowered.org/maven" }
56
}
67
dependencies {
78
classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT'
9+
classpath 'org.spongepowered:mixingradle:0.6-SNAPSHOT'
810
}
911
}
1012

@@ -15,13 +17,20 @@ plugins {
1517

1618
apply plugin: 'java'
1719
apply plugin: 'net.minecraftforge.gradle.forge'
20+
apply plugin: 'org.spongepowered.mixin'
1821

1922
repositories {
20-
maven { url "https://jitpack.io" }
23+
maven { url = "https://jitpack.io" }
24+
maven {
25+
name = 'sonatype'
26+
url = 'http://oss.sonatype.org/content/repositories/public/'
27+
}
28+
maven { url = "http://repo.spongepowered.org/maven" }
2129
}
2230

2331
configurations {
2432
embed
33+
coreShadow
2534
compile.extendsFrom(embed)
2635
}
2736

@@ -30,7 +39,8 @@ dependencies {
3039
embed 'org.jgrapht:jgrapht-core:1.1.0'
3140
embed 'com.github.DimensionalDevelopment:poly2tri.java:master-SNAPSHOT'
3241
compileOnly 'com.github.DimensionalDevelopment:AnnotatedNBT:-SNAPSHOT'
33-
compileOnly 'com.github.OpenCubicChunks:CubicChunks:MC_1.12-SNAPSHOT'
42+
compile("org.spongepowered:mixin:0.7.8-SNAPSHOT") { transitive = false }
43+
deobfProvided 'io.github.opencubicchunks:cubicchunks:1.12.2-0.0.819.0-SNAPSHOT'
3444
}
3545

3646
// Mod version
@@ -63,6 +73,19 @@ minecraft {
6373
mappings = mcpversion
6474
replace '${version}', fullVersion
6575
makeObfSourceJar = false
76+
//noinspection GroovyUnusedAssignment
77+
def args = [ // TODO: https://github.com/SpongePowered/Mixin/issues/140
78+
"-Dfml.noGrab=false",
79+
"-Dfml.coreMods.load=org.dimdev.vanillafix.VanillaFixCoreMod",
80+
"-Dmixin.env.compatLevel=JAVA_8",
81+
//"-Dmixin.debug.verbose=true",
82+
//"-Dmixin.debug.export=true",
83+
"-Dmixin.checks.interfaces=true"
84+
]
85+
}
86+
87+
mixin {
88+
add sourceSets.main, "org.dimdev.vanillafix.mixins.refmap.json"
6689
}
6790

6891
// Tasks
@@ -73,6 +96,15 @@ compileJava {
7396
jar {
7497
archiveName = archivesBaseName + "-" + jarVersion + ".jar"
7598
from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) }
99+
manifest {
100+
attributes(
101+
"TweakClass": "org.spongepowered.asm.launch.MixinTweaker",
102+
"FMLCorePlugin": "org.dimdev.vanillafix.VanillaFixCoreMod",
103+
"TweakOrder": 0,
104+
"MixinConfigs": "org.dimdev.vanillafix.mixins.json",
105+
"ForceLoadAsMod": "true"
106+
)
107+
}
76108
}
77109

78110
task sourcesJar(type: Jar, dependsOn: classes) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.dimdev.vanillafix;
2+
3+
import net.minecraftforge.fml.common.DummyModContainer;
4+
import net.minecraftforge.fml.common.ModMetadata;
5+
import net.minecraftforge.fml.common.versioning.ArtifactVersion;
6+
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
public class VanillaFixCoreContainer extends DummyModContainer {
11+
12+
public VanillaFixCoreContainer() {
13+
super(new ModMetadata());
14+
ModMetadata meta = getMetadata();
15+
meta.modId = "cubicchunkscore";
16+
meta.name = "VanillaFix";
17+
meta.version = "${version}";
18+
}
19+
20+
@Override
21+
public List<ArtifactVersion> getDependencies() {
22+
return Collections.emptyList();
23+
}
24+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.dimdev.vanillafix;
2+
3+
import net.minecraftforge.common.ForgeVersion;
4+
import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin;
5+
import org.spongepowered.asm.launch.MixinBootstrap;
6+
import org.spongepowered.asm.mixin.Mixins;
7+
8+
import javax.annotation.Nullable;
9+
import java.util.Map;
10+
11+
@IFMLLoadingPlugin.MCVersion(ForgeVersion.mcVersion)
12+
@IFMLLoadingPlugin.SortingIndex(5000)
13+
@IFMLLoadingPlugin.TransformerExclusions("org.dimdev.vanillafix.")
14+
public class VanillaFixCoreMod implements IFMLLoadingPlugin {
15+
16+
public VanillaFixCoreMod() {
17+
MixinBootstrap.init();
18+
Mixins.addConfiguration("org.dimdev.vanillafix.mixins.json");
19+
}
20+
21+
@Override public String[] getASMTransformerClass() {
22+
return new String[0];
23+
}
24+
25+
@Override public String getModContainerClass() {
26+
return "org.dimdev.vanillafix.VanillaFixCoreContainer";
27+
}
28+
29+
@Nullable @Override public String getSetupClass() {
30+
return null;
31+
}
32+
33+
@Override public void injectData(Map<String, Object> data) {}
34+
35+
@Override public String getAccessTransformerClass() {
36+
return null;
37+
}
38+
}
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
package org.dimdev.vanillafix.mixins;
2+
3+
import net.minecraft.entity.MoverType;
4+
import net.minecraft.entity.player.EntityPlayerMP;
5+
import net.minecraft.init.MobEffects;
6+
import net.minecraft.network.NetHandlerPlayServer;
7+
import net.minecraft.network.PacketThreadUtil;
8+
import net.minecraft.network.play.INetHandlerPlayServer;
9+
import net.minecraft.network.play.client.CPacketPlayer;
10+
import net.minecraft.server.MinecraftServer;
11+
import net.minecraft.util.math.Vec3d;
12+
import net.minecraft.util.text.ITextComponent;
13+
import net.minecraft.util.text.TextComponentTranslation;
14+
import net.minecraft.world.GameType;
15+
import net.minecraft.world.WorldServer;
16+
import org.apache.logging.log4j.Logger;
17+
import org.spongepowered.asm.mixin.Mixin;
18+
import org.spongepowered.asm.mixin.Overwrite;
19+
import org.spongepowered.asm.mixin.Shadow;
20+
21+
@SuppressWarnings("unused") // Shadow
22+
@Mixin(NetHandlerPlayServer.class)
23+
public abstract class MixinNetHandlerPlayServer implements INetHandlerPlayServer {
24+
25+
@Shadow public EntityPlayerMP player;
26+
@Shadow private /*final*/ MinecraftServer server;
27+
@Shadow private int networkTickCount;
28+
@Shadow private double firstGoodX;
29+
@Shadow private double firstGoodY;
30+
@Shadow private double firstGoodZ;
31+
@Shadow private double lastGoodX;
32+
@Shadow private double lastGoodY;
33+
@Shadow private double lastGoodZ;
34+
@Shadow private int lastPositionUpdate;
35+
@Shadow private boolean floating;
36+
@Shadow private Vec3d targetPos;
37+
@Shadow private static final Logger LOGGER = null;
38+
@Shadow private int movePacketCounter;
39+
@Shadow private int lastMovePacketCounter;
40+
41+
@Shadow public void disconnect(final ITextComponent textComponent) {}
42+
43+
@Shadow private static boolean isMovePlayerPacketInvalid(CPacketPlayer packetIn) { return false; }
44+
45+
@Shadow private void captureCurrentPosition() {}
46+
47+
@Shadow public void setPlayerLocation(double x, double y, double z, float yaw, float pitch) {}
48+
49+
@Overwrite
50+
@Override
51+
public void processPlayer(CPacketPlayer packet) {
52+
PacketThreadUtil.checkThreadAndEnqueue(packet, this, player.getServerWorld());
53+
54+
if (isMovePlayerPacketInvalid(packet)) {
55+
disconnect(new TextComponentTranslation("multiplayer.disconnect.invalid_player_movement"));
56+
} else {
57+
WorldServer world = server.getWorld(player.dimension);
58+
59+
if (player.queuedEndExit) return;
60+
61+
if (networkTickCount == 0) {
62+
captureCurrentPosition();
63+
}
64+
65+
if (targetPos != null) {
66+
if (networkTickCount - lastPositionUpdate > 20) {
67+
lastPositionUpdate = networkTickCount;
68+
setPlayerLocation(targetPos.x, targetPos.y, targetPos.z, player.rotationYaw, player.rotationPitch);
69+
}
70+
} else {
71+
lastPositionUpdate = networkTickCount;
72+
73+
if (player.isRiding()) {
74+
player.setPositionAndRotation(player.posX, player.posY, player.posZ, packet.getYaw(player.rotationYaw), packet.getPitch(player.rotationPitch));
75+
server.getPlayerList().serverUpdateMovingPlayer(player);
76+
} else {
77+
double oldX = player.posX;
78+
double oldY = player.posY;
79+
double oldZ = player.posZ;
80+
double oldY2 = player.posY;
81+
82+
double packetX = packet.getX(player.posX);
83+
double packetY = packet.getY(player.posY);
84+
double packetZ = packet.getZ(player.posZ);
85+
float packetYaw = packet.getYaw(player.rotationYaw);
86+
float packetPitch = packet.getPitch(player.rotationPitch);
87+
88+
double xDiff = packetX - firstGoodX;
89+
double yDiff = packetY - firstGoodY;
90+
double zDiff = packetZ - firstGoodZ;
91+
double speedSq = player.motionX * player.motionX + player.motionY * player.motionY + player.motionZ * player.motionZ;
92+
double distanceSq = xDiff * xDiff + yDiff * yDiff + zDiff * zDiff;
93+
94+
if (player.isPlayerSleeping()) {
95+
if (distanceSq > 1.0D) {
96+
setPlayerLocation(player.posX, player.posY, player.posZ, packet.getYaw(player.rotationYaw), packet.getPitch(player.rotationPitch));
97+
}
98+
} else {
99+
++movePacketCounter;
100+
int packetCount = movePacketCounter - lastMovePacketCounter;
101+
102+
if (packetCount > 5) {
103+
LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", player.getName(), packetCount);
104+
packetCount = 1;
105+
}
106+
107+
if (!player.isInvulnerableDimensionChange() && (!player.getServerWorld().getGameRules().getBoolean("disableElytraMovementCheck") || !player.isElytraFlying())) {
108+
float maxDistancePerTic = player.isElytraFlying() ? 300.0F : 100.0F;
109+
110+
if (distanceSq - speedSq > maxDistancePerTic * packetCount && (!server.isSinglePlayer() || !server.getServerOwner().equals(player.getName()))) {
111+
LOGGER.warn("{} moved too quickly! {},{},{}", player.getName(), xDiff, yDiff, zDiff);
112+
setPlayerLocation(player.posX, player.posY, player.posZ, player.rotationYaw, player.rotationPitch);
113+
return;
114+
}
115+
}
116+
117+
boolean notInsideBlock = world.getCollisionBoxes(player, player.getEntityBoundingBox().shrink(0.0625D)).isEmpty();
118+
xDiff = packetX - lastGoodX;
119+
yDiff = packetY - lastGoodY;
120+
zDiff = packetZ - lastGoodZ;
121+
122+
if (player.onGround && !packet.isOnGround() && yDiff > 0.0D) {
123+
player.jump();
124+
}
125+
126+
player.move(MoverType.PLAYER, xDiff, yDiff, zDiff);
127+
player.onGround = packet.isOnGround();
128+
double oldYDiff = yDiff;
129+
130+
xDiff = packetX - player.posX;
131+
yDiff = packetY - player.posY;
132+
if (yDiff > -0.5D || yDiff < 0.5D) { // TODO: But why?
133+
yDiff = 0.0D;
134+
}
135+
zDiff = packetZ - player.posZ;
136+
distanceSq = xDiff * xDiff + yDiff * yDiff + zDiff * zDiff;
137+
138+
boolean movedWrongly = false;
139+
if (!player.isInvulnerableDimensionChange() && distanceSq > 0.0625D && !player.isPlayerSleeping() && !player.interactionManager.isCreative() && player.interactionManager.getGameType() != GameType.SPECTATOR) {
140+
movedWrongly = true;
141+
LOGGER.warn("{} moved wrongly!", player.getName());
142+
}
143+
144+
// Fix https://bugs.mojang.com/browse/MC-98153
145+
//player.setPositionAndRotation(packetX, packetY, packetZ, packetYaw, packetPitch);
146+
//player.addMovementStat(player.posX - oldX, player.posY - oldY, player.posZ - oldZ);
147+
player.addMovementStat(packetX - oldX, packetY - oldY, packetZ - oldZ);
148+
149+
// Fix https://bugs.mojang.com/browse/MC-123364 (partially, players can still cheat to teleport into a portal)
150+
if (!player.isInvulnerableDimensionChange() && !player.noClip && !player.isPlayerSleeping()) {
151+
boolean oldPositionEmpty = world.getCollisionBoxes(player, player.getEntityBoundingBox().shrink(0.0625D)).isEmpty();
152+
153+
if (notInsideBlock && (movedWrongly || !oldPositionEmpty)) {
154+
setPlayerLocation(oldX, oldY, oldZ, packetYaw, packetPitch);
155+
return;
156+
}
157+
}
158+
159+
floating = oldYDiff >= -0.03125D;
160+
floating &= !server.isFlightAllowed() && !player.capabilities.allowFlying;
161+
floating &= !player.isPotionActive(MobEffects.LEVITATION) && !player.isElytraFlying() && !world.checkBlockCollision(player.getEntityBoundingBox().grow(0.0625D).expand(0.0D, -0.55D, 0.0D));
162+
player.onGround = packet.isOnGround();
163+
server.getPlayerList().serverUpdateMovingPlayer(player);
164+
player.handleFalling(player.posY - oldY2, packet.isOnGround());
165+
lastGoodX = player.posX;
166+
lastGoodY = player.posY;
167+
lastGoodZ = player.posZ;
168+
}
169+
}
170+
}
171+
}
172+
}
173+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"required": true,
3+
"package": "org.dimdev.vanillafix.mixins",
4+
"refmap": "org.dimdev.vanillafix.mixins.refmap.json",
5+
"compatibilityLevel": "JAVA_8",
6+
"minVersion": "0.6.15-SNAPSHOT",
7+
"mixins": [
8+
"MixinNetHandlerPlayServer"
9+
],
10+
"client": [],
11+
"server": [],
12+
"injectors": {
13+
"defaultRequire": 1
14+
},
15+
"overwrites": {
16+
"conformVisibility": true
17+
}
18+
}

0 commit comments

Comments
 (0)