Skip to content

Commit

Permalink
Implement PlayerToggleFlightEvent (#931)
Browse files Browse the repository at this point in the history
Related to #922.
  • Loading branch information
jhg023 authored and aramperes committed Jun 1, 2018
1 parent c7c10a1 commit ea5a0d0
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 16 deletions.
17 changes: 16 additions & 1 deletion src/main/java/net/glowstone/GlowServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
import net.glowstone.net.GlowSession;
import net.glowstone.net.SessionRegistry;
import net.glowstone.net.message.play.player.AdvancementsMessage;
import net.glowstone.net.message.play.player.PlayerAbilitiesMessage;
import net.glowstone.net.message.status.StatusRequestMessage;
import net.glowstone.net.query.QueryServer;
import net.glowstone.net.rcon.RconServer;
Expand Down Expand Up @@ -2120,7 +2121,6 @@ private OfflinePlayer getOfflinePlayerFallback(String name) {
.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes()), false));
}


@Override
public void savePlayers() {
getOnlinePlayers().forEach(Player::saveData);
Expand Down Expand Up @@ -2196,6 +2196,21 @@ public Set<OfflinePlayer> getBannedPlayers() {
.collect(Collectors.toSet());
}

/**
* Sends a {@link GlowPlayer} their abilities regarding
* flying and walking.
*
* @param player The player who is being sent their abilities.
*/
public void sendPlayerAbilities(GlowPlayer player) {
boolean creative = player.getGameMode() == GameMode.CREATIVE;
int flags = (creative ? 8 : 0) | (player.getAllowFlight() ? 4 : 0)
| (player.isFlying() ? 2 : 0) | (creative ? 1 : 0);
// division is conversion from Bukkit to MC units
player.getSession().send(new PlayerAbilitiesMessage(flags,
player.getFlySpeed() / 2F, player.getWalkSpeed() / 2F));
}

@Override
public GlowWorld getWorld(String name) {
return worlds.getWorld(name);
Expand Down
18 changes: 5 additions & 13 deletions src/main/java/net/glowstone/entity/GlowPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@
import net.glowstone.net.message.play.inv.SetWindowContentsMessage;
import net.glowstone.net.message.play.inv.SetWindowSlotMessage;
import net.glowstone.net.message.play.inv.WindowPropertyMessage;
import net.glowstone.net.message.play.player.PlayerAbilitiesMessage;
import net.glowstone.net.message.play.player.ResourcePackSendMessage;
import net.glowstone.net.message.play.player.UseBedMessage;
import net.glowstone.scoreboard.GlowScoreboard;
Expand Down Expand Up @@ -678,7 +677,7 @@ public void join(GlowSession session, PlayerReader reader) {
sendWeather();
sendRainDensity();
sendSkyDarkness();
sendAbilities();
getServer().sendPlayerAbilities(this);

// send initial location
session.send(new PositionRotationMessage(location));
Expand Down Expand Up @@ -1635,7 +1634,7 @@ public void setAllowFlight(boolean flight) {
if (!canFly) {
flying = false;
}
sendAbilities();
getServer().sendPlayerAbilities(this);
}

////////////////////////////////////////////////////////////////////////////
Expand All @@ -1644,26 +1643,19 @@ public void setAllowFlight(boolean flight) {
@Override
public void setFlying(boolean value) {
flying = value && canFly;
sendAbilities();
getServer().sendPlayerAbilities(this);
}

@Override
public void setFlySpeed(float value) throws IllegalArgumentException {
flySpeed = value;
sendAbilities();
getServer().sendPlayerAbilities(this);
}

@Override
public void setWalkSpeed(float value) throws IllegalArgumentException {
walkSpeed = value;
sendAbilities();
}

private void sendAbilities() {
boolean creative = getGameMode() == GameMode.CREATIVE;
int flags = (creative ? 8 : 0) | (canFly ? 4 : 0) | (flying ? 2 : 0) | (creative ? 1 : 0);
// division is conversion from Bukkit to MC units
session.send(new PlayerAbilitiesMessage(flags, flySpeed / 2f, walkSpeed / 2f));
getServer().sendPlayerAbilities(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package net.glowstone.net.handler.play.player;

import com.flowpowered.network.MessageHandler;
import net.glowstone.EventFactory;
import net.glowstone.entity.GlowPlayer;
import net.glowstone.net.GlowSession;
import net.glowstone.net.message.play.player.PlayerAbilitiesMessage;
import org.bukkit.event.player.PlayerToggleFlightEvent;

public final class PlayerAbilitiesHandler implements
MessageHandler<GlowSession, PlayerAbilitiesMessage> {
Expand All @@ -14,8 +16,23 @@ public void handle(GlowSession session, PlayerAbilitiesMessage message) {
// other values should match what we've sent in the past but are ignored here

GlowPlayer player = session.getPlayer();
boolean flying = (message.getFlags() & 0x02) != 0;
boolean flyingFlag = (message.getFlags() & 0x02) != 0;

player.setFlying(player.getAllowFlight() && flying);
// the current flying state
boolean isFlying = player.isFlying();
boolean canFly = player.getAllowFlight();
if (isFlying != flyingFlag) {
// fire the event if either the player disabled flying,
// or enabled it and is allowed to fly
if (!flyingFlag || canFly) {
PlayerToggleFlightEvent event = EventFactory.getInstance()
.callEvent(new PlayerToggleFlightEvent(player, flyingFlag));
if (event.isCancelled()) {
session.getServer().sendPlayerAbilities(player);
} else {
player.setFlying(flyingFlag);
}
}
}
}
}

0 comments on commit ea5a0d0

Please sign in to comment.