mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Fix stuff, also fixed the sizing of throwables as they were to big
This commit is contained in:
parent
fc04909508
commit
f83e2fb093
8 changed files with 126 additions and 40 deletions
|
|
@ -93,7 +93,7 @@ public final class EntityDefinitions {
|
|||
public static final EntityDefinition<EvokerFangsEntity> EVOKER_FANGS;
|
||||
public static final EntityDefinition<ThrowableItemEntity> EXPERIENCE_BOTTLE;
|
||||
public static final EntityDefinition<ExpOrbEntity> EXPERIENCE_ORB;
|
||||
public static final EntityDefinition<Entity> EYE_OF_ENDER;
|
||||
public static final EntityDefinition<EnderEyeEntity> EYE_OF_ENDER;
|
||||
public static final EntityDefinition<FallingBlockEntity> FALLING_BLOCK;
|
||||
public static final EntityDefinition<FireballEntity> FIREBALL;
|
||||
public static final EntityDefinition<FireworkEntity> FIREWORK_ROCKET;
|
||||
|
|
@ -250,7 +250,7 @@ public final class EntityDefinitions {
|
|||
.height(0.8f).width(0.5f)
|
||||
.identifier("minecraft:evocation_fang")
|
||||
.build();
|
||||
EYE_OF_ENDER = EntityDefinition.inherited(Entity::new, entityBase)
|
||||
EYE_OF_ENDER = EntityDefinition.inherited(EnderEyeEntity::new, entityBase)
|
||||
.type(EntityType.EYE_OF_ENDER)
|
||||
.heightAndWidth(0.25f)
|
||||
.identifier("minecraft:eye_of_ender_signal")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (c) 2024 GeyserMC. http://geysermc.org
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @author GeyserMC
|
||||
* @link https://github.com/GeyserMC/Geyser
|
||||
*/
|
||||
|
||||
package org.geysermc.geyser.entity.type;
|
||||
|
||||
|
||||
import org.cloudburstmc.math.vector.Vector3f;
|
||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
|
||||
import org.geysermc.geyser.entity.EntityDefinition;
|
||||
import org.geysermc.geyser.entity.EntityDefinitions;
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class EnderEyeEntity extends Entity {
|
||||
public EnderEyeEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
|
||||
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initializeMetadata() {
|
||||
super.initializeMetadata();
|
||||
// Correct sizing
|
||||
dirtyMetadata.put(EntityDataTypes.SCALE, 0.5f);
|
||||
}
|
||||
}
|
||||
|
|
@ -130,7 +130,7 @@ public class ThrowableEntity extends Entity implements Tickable {
|
|||
case SNOWBALL:
|
||||
case EGG:
|
||||
case ENDER_PEARL:
|
||||
return 0.03f;
|
||||
return 0.0325f;
|
||||
case LLAMA_SPIT:
|
||||
return 0.06f;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
package org.geysermc.geyser.entity.type;
|
||||
|
||||
import org.cloudburstmc.math.vector.Vector3f;
|
||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
|
||||
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
|
||||
import org.geysermc.geyser.entity.EntityDefinition;
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
|
|
@ -38,43 +39,34 @@ import java.util.UUID;
|
|||
* Used as a class for any projectile entity that looks like an item
|
||||
*/
|
||||
public class ThrowableItemEntity extends ThrowableEntity {
|
||||
/**
|
||||
* Number of ticks since the entity was spawned by the Java server
|
||||
*/
|
||||
private int age;
|
||||
private boolean invisible;
|
||||
|
||||
public ThrowableItemEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition<?> definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) {
|
||||
super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw);
|
||||
setFlag(EntityFlag.INVISIBLE, true);
|
||||
invisible = false;
|
||||
if (session.isFrozen()) {
|
||||
age = 4;
|
||||
checkVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initializeMetadata() {
|
||||
super.initializeMetadata();
|
||||
// Correct sizing
|
||||
dirtyMetadata.put(EntityDataTypes.SCALE, 0.5f);
|
||||
}
|
||||
private void checkVisibility() {
|
||||
Vector3f playerPos = session.getPlayerEntity().getPosition();
|
||||
// Prevent projectiles from blocking the player's screen
|
||||
setInvisible(position.distanceSquared(playerPos) < 9);
|
||||
|
||||
if (invisible != getFlag(EntityFlag.INVISIBLE)) {
|
||||
if (!invisible) {
|
||||
Vector3f playerPos = session.getPlayerEntity().getPosition();
|
||||
// Prevent projectiles from blocking the player's screen
|
||||
if (age >= 4 || position.distanceSquared(playerPos) > 16) {
|
||||
setFlag(EntityFlag.INVISIBLE, false);
|
||||
updateBedrockMetadata();
|
||||
}
|
||||
} else {
|
||||
setFlag(EntityFlag.INVISIBLE, true);
|
||||
updateBedrockMetadata();
|
||||
}
|
||||
setFlag(EntityFlag.INVISIBLE, invisible);
|
||||
updateBedrockMetadata();
|
||||
}
|
||||
age++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick() {
|
||||
public void drawTick() {
|
||||
checkVisibility();
|
||||
super.tick();
|
||||
super.drawTick();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -29,5 +29,7 @@ package org.geysermc.geyser.entity.type;
|
|||
* Implemented onto anything that should have code ran every Minecraft tick - 50 milliseconds.
|
||||
*/
|
||||
public interface Tickable {
|
||||
default void drawTick() {};
|
||||
void tick();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2022 GeyserMC. http://geysermc.org
|
||||
* Copyright (c) 2024 GeyserMC. http://geysermc.org
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
@ -560,9 +560,10 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
|
||||
private MinecraftProtocol protocol;
|
||||
|
||||
private float tickRate = 20.0f;
|
||||
|
||||
private boolean frozen = false;
|
||||
private boolean tickingFrozen = false;
|
||||
@Setter
|
||||
private int stepTicks = 0;
|
||||
private boolean gameShouldUpdate = true;
|
||||
|
||||
public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
|
||||
this.geyser = geyser;
|
||||
|
|
@ -846,7 +847,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
boolean floodgate = this.remoteServer.authType() == AuthType.FLOODGATE;
|
||||
|
||||
// Start ticking
|
||||
tickThread = eventLoop.scheduleAtFixedRate(this::tick, Math.round(1000 / tickRate), Math.round(1000 / tickRate), TimeUnit.MILLISECONDS);
|
||||
tickThread = eventLoop.scheduleAtFixedRate(this::tick, 50, 50, TimeUnit.MILLISECONDS);
|
||||
|
||||
this.protocol.setUseDefaultListeners(false);
|
||||
|
||||
|
|
@ -1075,11 +1076,10 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
downstream.connect(false, loginEvent.transferring());
|
||||
}
|
||||
|
||||
public void updateTickData(float tickRate, boolean frozen) {
|
||||
public void updateTickingState(float tickRate, boolean frozen) {
|
||||
tickThread.cancel(true);
|
||||
this.tickRate = tickRate;
|
||||
this.frozen = frozen;
|
||||
tickThread = eventLoop.scheduleAtFixedRate(this::tick, Math.round(1000 / getTickRate()), Math.round(1000 / getTickRate()), TimeUnit.MILLISECONDS);
|
||||
this.tickingFrozen = frozen;
|
||||
tickThread = eventLoop.scheduleAtFixedRate(this::tick, Math.round(1000 / tickRate), Math.round(1000 / tickRate), TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public void disconnect(String reason) {
|
||||
|
|
@ -1208,9 +1208,13 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
camera().removeFog("minecraft:fog_crimson_forest");
|
||||
isInWorldBorderWarningArea = false;
|
||||
}
|
||||
|
||||
if (!frozen) {
|
||||
for (Tickable entity : entityCache.getTickableEntities()) {
|
||||
gameShouldUpdate = !tickingFrozen || stepTicks > 0;
|
||||
if (stepTicks > 0) {
|
||||
--stepTicks;
|
||||
}
|
||||
for (Tickable entity : entityCache.getTickableEntities()) {
|
||||
entity.drawTick();
|
||||
if (gameShouldUpdate) {
|
||||
entity.tick();
|
||||
}
|
||||
}
|
||||
|
|
@ -2070,4 +2074,4 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
|||
packet.setSoftEnum(new CommandEnumData(name, Collections.singletonMap(enums, Collections.emptySet()), true));
|
||||
sendUpstreamPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -35,6 +35,6 @@ public class JavaTickingStateTranslator extends PacketTranslator<ClientboundTick
|
|||
|
||||
@Override
|
||||
public void translate(GeyserSession session, ClientboundTickingStatePacket packet) {
|
||||
session.updateTickData(packet.getTickRate(), packet.isFrozen());
|
||||
session.updateTickingState(packet.getTickRate(), packet.isFrozen());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright (c) 2024 GeyserMC. http://geysermc.org
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @author GeyserMC
|
||||
* @link https://github.com/GeyserMC/Geyser
|
||||
*/
|
||||
|
||||
package org.geysermc.geyser.translator.protocol.java;
|
||||
|
||||
import org.geysermc.geyser.session.GeyserSession;
|
||||
import org.geysermc.geyser.translator.protocol.PacketTranslator;
|
||||
import org.geysermc.geyser.translator.protocol.Translator;
|
||||
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundTickingStepPacket;
|
||||
|
||||
@Translator(packet = ClientboundTickingStepPacket.class)
|
||||
public class JavaTickingStepTranslator extends PacketTranslator<ClientboundTickingStepPacket> {
|
||||
|
||||
@Override
|
||||
public void translate(GeyserSession session, ClientboundTickingStepPacket packet) {
|
||||
session.setStepTicks(packet.getTickSteps());
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue