Skip to content

Instantly share code, notes, and snippets.

@ucchyocean
Created July 18, 2013 22:21
Show Gist options
  • Save ucchyocean/6033639 to your computer and use it in GitHub Desktop.
Save ucchyocean/6033639 to your computer and use it in GitHub Desktop.
ゲームオーバー画面のスキップ
/*
* @author ucchy
* @license LGPLv3
* @copyright Copyright ucchy 2013
*/
package jp.ucchy.rs;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
/**
* リスポーンスキッパー
* @author ucchy
*/
public class RespawnSkiper extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onPlayerDeath(PlayerDeathEvent event) {
Player player = event.getEntity();
// NOTE: PlayerDeathEvent発生時に体力を回復すると、ゲームオーバー画面が出ない
player.setHealth(player.getMaxHealth());
// 正確にリスポーンを再現するには、他にもいろいろ実行する必要がある。
// 空気とスタミナの回復
player.setRemainingAir(player.getMaximumAir());
player.setFoodLevel(20);
// リスポーン場所への転送
Location loc = player.getBedSpawnLocation();
if ( loc == null ) {
World world = player.getLocation().getWorld();
loc = world.getSpawnLocation();
}
if ( loc != null ) {
player.teleport(loc, TeleportCause.PLUGIN); // 転送
player.setVelocity(new Vector()); // ノックバックの除去
}
}
}
@ucchyocean
Copy link
Author

ゲームオーバー画面を経由しないので、PlayerRespawnEvent は発生しない。

@ucchyocean
Copy link
Author

プレイヤーの状況リセット処理は、EntityPlayer#reset が呼び出されているので、その内容が参考になるだろう。
(上の例では、FireTicksやFallDistance、各種ポーションの効果削除などが実装されていないので、リスポーン後に残る。)
https://github.com/Bukkit/CraftBukkit/blob/master/src/main/java/net/minecraft/server/EntityPlayer.java#L910

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment