142 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.server.level;
 | |
| 
 | |
| import com.google.common.base.Objects;
 | |
| import com.google.common.collect.Lists;
 | |
| import com.google.common.collect.Sets;
 | |
| import java.util.Collection;
 | |
| import java.util.Collections;
 | |
| import java.util.Set;
 | |
| import java.util.function.Function;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.network.protocol.game.ClientboundBossEventPacket;
 | |
| import net.minecraft.util.Mth;
 | |
| import net.minecraft.world.BossEvent;
 | |
| 
 | |
| public class ServerBossEvent extends BossEvent {
 | |
| 	private final Set<ServerPlayer> players = Sets.<ServerPlayer>newHashSet();
 | |
| 	private final Set<ServerPlayer> unmodifiablePlayers = Collections.unmodifiableSet(this.players);
 | |
| 	private boolean visible = true;
 | |
| 
 | |
| 	public ServerBossEvent(Component name, BossEvent.BossBarColor color, BossEvent.BossBarOverlay overlay) {
 | |
| 		super(Mth.createInsecureUUID(), name, color, overlay);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void setProgress(float progress) {
 | |
| 		if (progress != this.progress) {
 | |
| 			super.setProgress(progress);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdateProgressPacket);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void setColor(BossEvent.BossBarColor color) {
 | |
| 		if (color != this.color) {
 | |
| 			super.setColor(color);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdateStylePacket);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void setOverlay(BossEvent.BossBarOverlay overlay) {
 | |
| 		if (overlay != this.overlay) {
 | |
| 			super.setOverlay(overlay);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdateStylePacket);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public BossEvent setDarkenScreen(boolean darkenSky) {
 | |
| 		if (darkenSky != this.darkenScreen) {
 | |
| 			super.setDarkenScreen(darkenSky);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdatePropertiesPacket);
 | |
| 		}
 | |
| 
 | |
| 		return this;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public BossEvent setPlayBossMusic(boolean playEndBossMusic) {
 | |
| 		if (playEndBossMusic != this.playBossMusic) {
 | |
| 			super.setPlayBossMusic(playEndBossMusic);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdatePropertiesPacket);
 | |
| 		}
 | |
| 
 | |
| 		return this;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public BossEvent setCreateWorldFog(boolean createFog) {
 | |
| 		if (createFog != this.createWorldFog) {
 | |
| 			super.setCreateWorldFog(createFog);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdatePropertiesPacket);
 | |
| 		}
 | |
| 
 | |
| 		return this;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public void setName(Component name) {
 | |
| 		if (!Objects.equal(name, this.name)) {
 | |
| 			super.setName(name);
 | |
| 			this.broadcast(ClientboundBossEventPacket::createUpdateNamePacket);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private void broadcast(Function<BossEvent, ClientboundBossEventPacket> packetGetter) {
 | |
| 		if (this.visible) {
 | |
| 			ClientboundBossEventPacket clientboundBossEventPacket = (ClientboundBossEventPacket)packetGetter.apply(this);
 | |
| 
 | |
| 			for (ServerPlayer serverPlayer : this.players) {
 | |
| 				serverPlayer.connection.send(clientboundBossEventPacket);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Makes the boss visible to the given player.
 | |
| 	 */
 | |
| 	public void addPlayer(ServerPlayer player) {
 | |
| 		if (this.players.add(player) && this.visible) {
 | |
| 			player.connection.send(ClientboundBossEventPacket.createAddPacket(this));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Makes the boss non-visible to the given player.
 | |
| 	 */
 | |
| 	public void removePlayer(ServerPlayer player) {
 | |
| 		if (this.players.remove(player) && this.visible) {
 | |
| 			player.connection.send(ClientboundBossEventPacket.createRemovePacket(this.getId()));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void removeAllPlayers() {
 | |
| 		if (!this.players.isEmpty()) {
 | |
| 			for (ServerPlayer serverPlayer : Lists.newArrayList(this.players)) {
 | |
| 				this.removePlayer(serverPlayer);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public boolean isVisible() {
 | |
| 		return this.visible;
 | |
| 	}
 | |
| 
 | |
| 	public void setVisible(boolean visible) {
 | |
| 		if (visible != this.visible) {
 | |
| 			this.visible = visible;
 | |
| 
 | |
| 			for (ServerPlayer serverPlayer : this.players) {
 | |
| 				serverPlayer.connection.send(visible ? ClientboundBossEventPacket.createAddPacket(this) : ClientboundBossEventPacket.createRemovePacket(this.getId()));
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * The returned collection is unmodifiable
 | |
| 	 */
 | |
| 	public Collection<ServerPlayer> getPlayers() {
 | |
| 		return this.unmodifiablePlayers;
 | |
| 	}
 | |
| }
 |