类org.bukkit.event.player.PlayerJoinEvent源码实例Demo

下面列出了怎么用org.bukkit.event.player.PlayerJoinEvent的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: CratesPlus   文件: PlayerJoin.java
@EventHandler(ignoreCancelled = true)
public void onPlayerJoin(final PlayerJoinEvent event) {
    Bukkit.getScheduler().runTaskLater(cratesPlus, () -> {
        if (cratesPlus.isUpdateAvailable() && event.getPlayer().hasPermission("cratesplus.updates")) {
            event.getPlayer().sendMessage(cratesPlus.getUpdateMessage());
        }
        if (cratesPlus.getConfigBackup() != null && event.getPlayer().hasPermission("cratesplus.admin")) {
            event.getPlayer().sendMessage(cratesPlus.getPluginPrefix() + ChatColor.GREEN + "Your config has been updated. Your old config was backed up to " + cratesPlus.getConfigBackup());
            cratesPlus.setConfigBackup(null);
        }
        if (cratesPlus.getCrateHandler().hasPendingKeys(event.getPlayer().getUniqueId())) {
            if (cratesPlus.getConfigHandler().getClaimMessageDelay() > -1) {
                Bukkit.getScheduler().runTaskLater(cratesPlus, () -> MessageHandler.sendMessage(event.getPlayer(), "&aYou currently have keys waiting to be claimed, use /crate to claim", null, null), cratesPlus.getConfigHandler().getClaimMessageDelay() > 0 ? (20 * cratesPlus.getConfigHandler().getClaimMessageDelay()) : 0);
            }
        }
    }, 1L);
}
 
源代码2 项目: AuthMeReloaded   文件: PlayerListenerTest.java
@Test
public void shouldNotModifyJoinMessage() {
    // given
    Player player = mock(Player.class);
    String joinMsg = "The player joined";
    PlayerJoinEvent event = new PlayerJoinEvent(player, joinMsg);
    given(settings.getProperty(RegistrationSettings.REMOVE_JOIN_MESSAGE)).willReturn(false);
    given(settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE)).willReturn("");
    given(settings.getProperty(RegistrationSettings.DELAY_JOIN_MESSAGE)).willReturn(false);

    // when
    listener.onJoinMessage(event);

    // then
    assertThat(event.getJoinMessage(), equalTo(joinMsg));
    verifyNoInteractions(joinMessageService);
}
 
源代码3 项目: BedWars   文件: PlayerListener.java
@EventHandler
public void onJoin(PlayerJoinEvent event) {
    final Player player = event.getPlayer();
    final Game game = Main.getApi().getFirstWaitingGame();

    if (game != null) {
        game.joinToGame(event.getPlayer());
    } else if (!player.hasPermission("misat11.bw.admin")) {
        ByteArrayDataOutput out = ByteStreams.newDataOutput();

        out.writeUTF("Connect");
        out.writeUTF(Main.getApi().getHubServerName());

        player.sendPluginMessage(Main.getInstance(), "BungeeCord", out.toByteArray());
    }
}
 
源代码4 项目: MineCloud   文件: PlayerTracker.java
@EventHandler
public void playerJoin(PlayerJoinEvent event) {
    Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
        Server server = plugin.server();
        List<PlayerData> onlinePlayers = server.onlinePlayers();
        Player player = event.getPlayer();
        PlayerData data = new PlayerData();

        data.setHealth(player.getHealth());
        data.setMaxHealth(player.getMaxHealth());
        data.setName(player.getName());
        data.setId(player.getUniqueId().toString());

        onlinePlayers.add(data);

        server.setOnlinePlayers(onlinePlayers);
        plugin.updatePlayers(server);
        plugin.mongo().repositoryBy(Server.class).save(server);
    });
}
 
源代码5 项目: PGM   文件: ModerationCommand.java
@EventHandler(priority = EventPriority.MONITOR)
public void onLogin(PlayerJoinEvent event) {
  Optional<BannedAccountInfo> ban =
      getBanWithMatchingIP(event.getPlayer().getAddress().getAddress().getHostAddress());

  ban.ifPresent(
      info -> {
        if (!isBanStillValid(event.getPlayer())) {
          removeCachedBan(info);
          return;
        }

        final MatchPlayer matchPlayer = manager.getPlayer(event.getPlayer());
        final Match match = matchPlayer.getMatch();

        ChatDispatcher.broadcastAdminChatMessage(
            formatAltAccountBroadcast(info, matchPlayer), match);
      });
}
 
源代码6 项目: PGM   文件: PGMListener.java
@EventHandler(priority = EventPriority.LOW)
public void addPlayerOnJoin(final PlayerJoinEvent event) {
  if (this.mm.getMatch(event.getWorld()) == null) {
    event
        .getPlayer()
        .kickPlayer(
            ChatColor.RED + TextTranslations.translate("misc.incorrectWorld", event.getPlayer()));
    this.parent
        .getLogger()
        .info(
            "Had to kick player "
                + event.getPlayer().getName()
                + " due to them spawning in the incorrect world");
    return;
  }

  this.mm.getMatch(event.getWorld()).addPlayer(event.getPlayer());
}
 
源代码7 项目: TAB   文件: Main.java
@EventHandler(priority = EventPriority.LOWEST)
public void a(PlayerJoinEvent e) {
	try {
		if (Shared.disabled) return;
		if (Configs.bukkitBridgeMode) return;
		ITabPlayer p = new TabPlayer(e.getPlayer());
		Shared.data.put(e.getPlayer().getUniqueId(), p);
		Shared.entityIdMap.put(e.getPlayer().getEntityId(), p);
		inject(e.getPlayer().getUniqueId());
		Shared.featureCpu.runMeasuredTask("processing player join", CPUFeature.OTHER, new Runnable() {

			public void run() {
				Shared.joinListeners.forEach(f -> f.onJoin(p));
				p.onJoinFinished = true;
			}
		});
	} catch (Throwable ex) {
		Shared.errorManager.criticalError("An error occurred when processing PlayerJoinEvent", ex);
	}
}
 
源代码8 项目: DungeonsXL   文件: DPlayerListener.java
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
    Player player = event.getPlayer();
    if (plugin.checkPlayer(player)) {
        return;
    }

    DGlobalPlayer dPlayer = new DGlobalPlayer(plugin, player);
    if (dPlayer.getData().wasInGame()) {
        dPlayer.reset(dPlayer.getData().getOldLocation() != null ? dPlayer.getData().getOldLocation() : Bukkit.getWorlds().get(0).getSpawnLocation(),
                dPlayer.getData().getKeepInventoryAfterLogout());
    }

    if (!dPlayer.getData().hasFinishedTutorial() && config.isTutorialActivated()) {
        if (plugin.getInstanceCache().size() < config.getMaxInstances()) {
            dPlayer.startTutorial();
        } else {
            event.getPlayer().kickPlayer(DMessage.ERROR_TOO_MANY_TUTORIALS.getMessage());
        }
    }
}
 
源代码9 项目: CombatLogX   文件: ListenerLogin.java
@EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
public void onJoin(PlayerJoinEvent e) {
    Player player = e.getPlayer();
    player.setCanPickupItems(false);

    NPCManager npcManager = this.expansion.getNPCManager();
    NPC npc = npcManager.getNPC(player);
    if(npc != null) npc.despawn(DespawnReason.PLUGIN);
    
    Runnable task = () -> {
        punish(player);
        player.setCanPickupItems(true);
    };

    JavaPlugin plugin = this.expansion.getPlugin().getPlugin();
    BukkitScheduler scheduler = Bukkit.getScheduler();
    scheduler.runTaskLater(plugin, task, 1L);
}
 
源代码10 项目: DiscordBot   文件: PlayerListener.java
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
	if (!DiscordBotCore.getInstance().getConfiguration().isPlayerJoin() || event.getPlayer().hasPermission("DiscordBot.Silent")) {
		return;
	}
	
	Message message = new Message()
			.setChannel(DiscordBotCore.getInstance().getConfiguration().getChannels().get("InGame").getChannel())
			.setFormat(DiscordBotCore.getInstance().getConfiguration().getChannelFormat().get("InGame"))
			.setName(event.getPlayer().getName())
			.setNick(event.getPlayer().getDisplayName())
			.setServer("Unknown")
			.setMessage("Joined")
			.setDiscord(true)
			.setMinecraft(false)
			.setConsole(false)
			.setRedis(false);
	
	if (event.getPlayer().getServer() != null && event.getPlayer().getServer().getName() != null) {
		message.setServer(event.getPlayer().getServer().getName());
	}
	
	DiscordBotCore.getInstance().getMessageSender().sendMessage(message);
	return;
}
 
源代码11 项目: FastLogin   文件: ConnectionListener.java
@EventHandler(ignoreCancelled = true)
public void onPlayerJoin(PlayerJoinEvent joinEvent) {
    Player player = joinEvent.getPlayer();

    Bukkit.getScheduler().runTaskLater(plugin, () -> {
        // session exists so the player is ready for force login
        // cases: Paper (firing BungeeCord message before PlayerJoinEvent) or not running BungeeCord and already
        // having the login session from the login process
        BukkitLoginSession session = plugin.getSession(player.getAddress());
        if (session == null) {
            String sessionId = plugin.getSessionId(player.getAddress());
            plugin.getLog().info("No on-going login session for player: {} with ID {}", player, sessionId);
        } else {
            Runnable forceLoginTask = new ForceLoginTask(plugin.getCore(), player, session);
            Bukkit.getScheduler().runTaskAsynchronously(plugin, forceLoginTask);
        }

        plugin.getBungeeManager().markJoinEventFired(player);
        // delay the login process to let auth plugins initialize the player
        // Magic number however as there is no direct event from those plugins
    }, DELAY_LOGIN);
}
 
源代码12 项目: StaffPlus   文件: PlayerJoin.java
@EventHandler(priority = EventPriority.NORMAL)
public void onJoin(PlayerJoinEvent event)
{
	Player player = event.getPlayer();
	UUID uuid = player.getUniqueId();
	
	manageUser(player);
	vanishHandler.updateVanish();
	
	if(permission.has(player, options.permissionMode) && options.modeEnableOnLogin)
	{
		modeCoordinator.addMode(player);
	}
	
	if(options.loginEnabled && permission.has(player, options.permissionMember))
	{
		if(securityHandler.hasPassword(uuid))
		{
			freezeHandler.addFreeze(player, player, false);
			message.send(player, messages.loginWaiting, messages.prefixGeneral);
		}else message.send(player, messages.loginRegister, messages.prefixGeneral);
	}
}
 
源代码13 项目: BetonQuest   文件: JoinQuitListener.java
@EventHandler(ignoreCancelled = true)
public void onPlayerJoin(PlayerJoinEvent event) {
    String playerID = PlayerConverter.getID(event.getPlayer());
    // start objectives when the data is loaded
    PlayerData playerData = BetonQuest.getInstance().getPlayerData(playerID);
    // if the data still isn't loaded, force loading (this happens sometimes
    // probably because AsyncPlayerPreLoginEvent does not fire)
    if (playerData == null) {
        playerData = new PlayerData(playerID);
        BetonQuest.getInstance().putPlayerData(playerID, playerData);
        LogUtils.getLogger().log(Level.WARNING, "Failed to load data for player " + event.getPlayer().getName() + ", forcing.");
    }
    playerData.startObjectives();
    GlobalObjectives.startAll(playerID);
    // display changelog message to the admins
    if (event.getPlayer().hasPermission("betonquest.admin")
            && new File(BetonQuest.getInstance().getDataFolder(), "CHANGELOG.md").exists()) {
        Config.sendNotify(PlayerConverter.getID(event.getPlayer()), "changelog", null, "changelog,info");
    }
    if (Journal.hasJournal(playerID)) {
        playerData.getJournal().update();
    }
    if (playerData.getConversation() != null) {
        new ConversationResumer(playerID, playerData.getConversation());
    }
}
 
源代码14 项目: AuthMeReloaded   文件: PlayerListenerTest.java
@Test
public void shouldDelayJoinMessage() {
    // given
    Player player = mock(Player.class);
    given(player.getName()).willReturn("thename0");
    given(player.getDisplayName()).willReturn("(not used)");
    String joinMsg = "The player joined";
    PlayerJoinEvent event = new PlayerJoinEvent(player, joinMsg);
    given(settings.getProperty(RegistrationSettings.REMOVE_JOIN_MESSAGE)).willReturn(false);
    given(settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE))
        .willReturn("{PLAYERNAME} is joining us");
    given(settings.getProperty(RegistrationSettings.DELAY_JOIN_MESSAGE)).willReturn(true);

    // when
    listener.onJoinMessage(event);

    // then
    assertThat(event.getJoinMessage(), nullValue());
    verify(joinMessageService).putMessage("thename0", "thename0 is joining us");
}
 
源代码15 项目: SkinsRestorerX   文件: PlayerJoin.java
@EventHandler
public void onJoin(PlayerJoinEvent e) {
    Bukkit.getScheduler().runTaskAsynchronously(SkinsRestorer.getInstance(), () -> {
        try {
            if (Config.DISABLE_ONJOIN_SKINS) {
                // factory.applySkin(e.getPlayer(), SkinStorage.getSkinData(SkinStorage.getPlayerSkin(e.getPlayer().getName())));
                // shouldn't it just skip it if it's true?
                return;
            }

            // Don't change skin if player has no custom skin-name set and his username is invalid
            if (plugin.getSkinStorage().getPlayerSkin(e.getPlayer().getName()) == null && !C.validUsername(e.getPlayer().getName())) {
                System.out.println("[SkinsRestorer] Not applying skin to " + e.getPlayer().getName() + " (invalid username).");
                return;
            }

            String skin = plugin.getSkinStorage().getDefaultSkinNameIfEnabled(e.getPlayer().getName());

            SkinsRestorer.getInstance().getFactory().applySkin(e.getPlayer(), plugin.getSkinStorage().getOrCreateSkinForPlayer(skin));
        } catch (SkinRequestException ignored) {
        }
    });
}
 
源代码16 项目: Transport-Pipes   文件: PlayerListener.java
@EventHandler
public void onJoin(PlayerJoinEvent event) {
    if (generalConf.isCraftingEnabled()) {
        List<NamespacedKey> keys = new ArrayList<>();
        for (BaseDuctType bdt : ductRegister.baseDuctTypes()) {
            for (Object type : bdt.ductTypes()) {
                DuctType dt = (DuctType) type;
                if (dt.getDuctRecipe() != null) {
                    NamespacedKey key = ((Keyed) dt.getDuctRecipe()).getKey();
                    keys.add(key);
                }
            }
            if (bdt.is("pipe")) {
                keys.add(((PipeManager) bdt.getDuctManager()).getWrenchRecipe().getKey());
            }
        }
        event.getPlayer().discoverRecipes(keys);
    }
}
 
源代码17 项目: civcraft   文件: BonusGoodieManager.java
@EventHandler(priority = EventPriority.MONITOR) 
public void OnPlayerJoinEvent(PlayerJoinEvent event) {
	Inventory inv = event.getPlayer().getInventory();
	
	for (ConfigTradeGood good : CivSettings.goods.values()) {
		for (Entry<Integer, ? extends ItemStack> itemEntry : inv.all(ItemManager.getMaterial(good.material)).entrySet()) {
			if (good.material_data != ItemManager.getData(itemEntry.getValue())) {
				continue;
			}
			
			BonusGoodie goodie = CivGlobal.getBonusGoodie(itemEntry.getValue());
			if (goodie != null) {
				inv.remove(itemEntry.getValue());				
			}
		}
	}
}
 
源代码18 项目: KTP   文件: UHPluginListener.java
@EventHandler
public void onPlayerJoin(final PlayerJoinEvent ev) {
	if (!this.p.isGameRunning()) {
		ev.getPlayer().setGameMode(GameMode.CREATIVE);
		Location l = ev.getPlayer().getWorld().getSpawnLocation();
		ev.getPlayer().teleport(l.add(0,1,0));
	}
	p.addToScoreboard(ev.getPlayer());
	Bukkit.getScheduler().runTaskLater(this.p, new BukkitRunnable() {
		
		@Override
		public void run() {
			p.updatePlayerListName(ev.getPlayer());
		}
	}, 1L);
}
 
源代码19 项目: iDisguise   文件: EventListener.java
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerJoinHighest(PlayerJoinEvent event) {
	Player player = event.getPlayer();
	ProfileHelper.getInstance().registerGameProfile(player);
	if(DisguiseManager.isDisguised(player)) {
		if(!plugin.getLanguage().JOIN_DISGUISED.isEmpty())
			player.sendMessage(plugin.getLanguage().JOIN_DISGUISED);
	}
	if(plugin.getConfiguration().MODIFY_MESSAGE_JOIN) {
		if(event.getJoinMessage() != null && DisguiseManager.isDisguised(player)) {
			if(DisguiseManager.getDisguise(player) instanceof PlayerDisguise) {
				event.setJoinMessage(event.getJoinMessage().replace(player.getName(), ((PlayerDisguise)DisguiseManager.getDisguise(player)).getDisplayName()));
			} else {
				event.setJoinMessage(null);
			}
		}
	}
	if(player.hasPermission("iDisguise.update") && plugin.getConfiguration().UPDATE_CHECK) {
		plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new UpdateCheck(plugin, player, plugin.getConfiguration().UPDATE_DOWNLOAD), 20L);
	}
}
 
源代码20 项目: Plan   文件: BukkitPingCounter.java
@EventHandler
public void onPlayerJoin(PlayerJoinEvent joinEvent) {
    Player player = joinEvent.getPlayer();
    Long pingDelay = config.get(TimeSettings.PING_PLAYER_LOGIN_DELAY);
    if (pingDelay >= TimeUnit.HOURS.toMillis(2L)) {
        return;
    }
    runnableFactory.create("Add Player to Ping list", new AbsRunnable() {
        @Override
        public void run() {
            if (player.isOnline()) {
                addPlayer(player);
            }
        }
    }).runTaskLater(TimeAmount.toTicks(pingDelay, TimeUnit.MILLISECONDS));
}
 
源代码21 项目: AnimatedFrames   文件: PlayerListener.java
@EventHandler
public void on(final PlayerJoinEvent event) {
	Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
		@Override
		public void run() {
			for (AnimatedFrame frame : plugin.frameManager.getFrames()) {
				frame.addViewer(event.getPlayer());
			}
		}
	}, 20);

	if (event.getPlayer().hasPermission("animatedframes.updatecheck")) {
		plugin.spigetUpdate.checkForUpdate(new UpdateCallback() {
			@Override
			public void updateAvailable(String s, String s1, boolean b) {
				plugin.updateAvailable = true;
				event.getPlayer().sendMessage("§aA new version for §6AnimatedFrames §ais available (§7v" + s + "§a). Download it from https://r.spiget.org/5583");
			}

			@Override
			public void upToDate() {
			}
		});
	}
}
 
源代码22 项目: Civs   文件: ItemsTests.java
@Test
public void newPlayerShouldRecieveAShelterItem() {
    loadRegionTypeShelter();
    CivilianManager.getInstance();
    PlayerJoinEvent event = new PlayerJoinEvent(TestUtil.player, "blah");
    CivilianListener civilianListener = new CivilianListener();
    civilianListener.onCivilianJoin(event);
    Civilian civilian = CivilianManager.getInstance().getCivilian(TestUtil.player.getUniqueId());
    boolean hasShelter = false;
    for (String currentName : civilian.getStashItems().keySet()) {
        if (currentName.equalsIgnoreCase("shelter")) {
            hasShelter = true;
        }
    }
    assertTrue(hasShelter);
}
 
源代码23 项目: Minepacks   文件: CooldownManager.java
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoinEvent(PlayerJoinEvent event)
{
	if(syncCooldown)
	{
		final UUID uuid = event.getPlayer().getUniqueId();
		cooldowns.put(uuid, System.currentTimeMillis() + cooldown); // Temporary cooldown till the data is loaded from the database
		plugin.getDatabase().getCooldown(event.getPlayer(), new Callback<Long>() {
			@Override
			public void onResult(Long dbCooldownTime)
			{
				if(dbCooldownTime > System.currentTimeMillis())
				{
					cooldowns.put(uuid, dbCooldownTime);
				}
			}

			@Override
			public void onFail() {}
		});
	}
	else if(addOnJoin)
	{
		setCooldown(event.getPlayer());
	}
}
 
源代码24 项目: AnnihilationPro   文件: AnniPlayer.java
@EventHandler(priority = EventPriority.LOWEST)
public void playerCheck(PlayerJoinEvent event)
{
	final Player p = event.getPlayer();
	if(!exists(p))
		loadPlayer(p);
}
 
源代码25 项目: IridiumSkyblock   文件: PlayerJoinLeaveListener.java
@EventHandler
public void onJoin(PlayerJoinEvent event) {
    try {
        final Player player = event.getPlayer();
        final IridiumSkyblock plugin = IridiumSkyblock.getInstance();
        if (player.isOp()) {
            final String latest = plugin.getLatest();
            if (plugin.getLatest() != null
                    && IridiumSkyblock.getConfiguration().notifyAvailableUpdate
                    && !latest.equals(plugin.getDescription().getVersion())) {
                final String prefix = IridiumSkyblock.getConfiguration().prefix;
                player.sendMessage(Utils.color(prefix + " &7This message is only seen by opped players."));
                player.sendMessage(Utils.color(prefix + " &7Newer version available: " + latest));
            }
        }

        final Location location = player.getLocation();
        final IslandManager islandManager = IridiumSkyblock.getIslandManager();
        if (!islandManager.isIslandWorld(location)) return;

        final User user = User.getUser(player);
        user.name = player.getName();

        if (user.flying && (user.getIsland() == null || user.getIsland().getFlightBooster() == 0)) {
            player.setAllowFlight(false);
            player.setFlying(false);
            user.flying = false;
        }
        user.bypassing = false;

        final Island island = islandManager.getIslandViaLocation(location);
        if (island == null) return;

        Bukkit.getScheduler().runTaskLater(plugin, () -> island.sendBorder(player), 1);
    } catch (Exception e) {
        IridiumSkyblock.getInstance().sendErrorMessage(e);
    }
}
 
源代码26 项目: mcspring-boot   文件: ListenerTest.java
@Test
public void shouldRegisterAllEventsInTheListener() {
    verify(server.getPluginManager()).registerEvent(eq(PlayerJoinEvent.class), eq(testListener),
            eq(EventPriority.NORMAL), notNull(), eq(plugin), eq(true));
    verify(server.getPluginManager()).registerEvent(eq(PlayerQuitEvent.class), eq(testListener),
            eq(EventPriority.HIGHEST), notNull(), eq(plugin), eq(false));
}
 
源代码27 项目: mcspring-boot   文件: ListenerTest.java
@Test
@SneakyThrows
public void shouldExecuteEventOnListener() {
    springEventExecutor
            .create(TestListener.class.getDeclaredMethod("onJoin", PlayerJoinEvent.class))
            .execute(testListener, new PlayerJoinEvent(player, ""));

    verify(player).sendMessage("join");
    verify(player, never()).sendMessage("quit");
}
 
源代码28 项目: PGM   文件: FreezeMatchModule.java
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
  if (freeze.isCached(event.getPlayer().getUniqueId())) {
    freeze.removeCachedPlayer(event.getPlayer().getUniqueId());
    freeze.setFrozen(Bukkit.getConsoleSender(), match.getPlayer(event.getPlayer()), true, true);
  }
}
 
源代码29 项目: BetonQuest   文件: BetonLangAPIIntegrator.java
@Override
public void hook() {
    new LangChangeListener();
    for (Player player : Bukkit.getOnlinePlayers()) {
        updateLang(player);
    }
    Bukkit.getPluginManager().registerEvents(new Listener() {
        @EventHandler(ignoreCancelled = true)
        public void onJoin(PlayerJoinEvent event) {
            updateLang(event.getPlayer());
        }
    }, BetonQuest.getInstance());
    plugin.registerEvents("language", BetonLangAPIEvent.class);
}
 
源代码30 项目: TrMenu   文件: Updater.java
@EventHandler
public void onJoin(PlayerJoinEvent e) {
    Player p = e.getPlayer();

    if (old && !noticed.contains(p.getUniqueId()) && p.hasPermission("trmenu.admin")) {
        noticed.add(p.getUniqueId());
        Bukkit.getScheduler().runTaskLaterAsynchronously(TrMenu.getPlugin(), () -> TLocale.sendTo(p, "PLUGIN.UPDATER.OLD", newVersion), 1);
    }
}
 
 类所在包
 类方法
 同包方法