Jump to content

Spieler soll Elytra bekommen und weggenommen bekommen wenn er landet! [Einweg Elytra]


Jens Becker
 Share

Recommended Posts

Hallo, 

Ich möchte/habe ein Spigot Plugin programmiert was folgendes bewirken soll:

-Spieler gibt /elytra ein und bekommt Elytra (funktoiniert)

-Spieler kann mit Elytra fliegen (funktioniert)

-Spieler soll Elytra weggenommen bekommen wenn er landet (funktioniert teilweise, denn: Wie mach ich das das dauernt überprüt werden soll ob sich unter dem Spieler keine Luft befindet?? Weil wenn ich das wie unten zusehen mit einer whileschleife mache stürzt der Server ab weil dauernd ja text ausgegeben werden soll?! 

Hier der Code: (An der plugin.yml Datei liegt es nicht)

package me.Jensis.EinwegElytra;

import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;



public class EinwegElytra extends JavaPlugin 
{

	public void onEnable()
	{
		System.out.println("[EE] GELADEN UND AKTIVIERT");
		
	}
	
	
	public void onDisable()
	{
		System.out.println("[EE] DEAKTIVIERT UND ENTLADEN");
		
	}
	
	
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
	{
		if (cmd.getName().equalsIgnoreCase("elytra"))
		{
		
				Player spieler = (Player) sender;
				ItemStack item = new ItemStack(Material.ELYTRA, 1);
				ItemMeta met =item.getItemMeta();
				item.setItemMeta(met);
				spieler.getInventory().setChestplate(item);
				
				
				int zahl = 2; 
				while (zahl== 2)
				{
				
						
					if (spieler.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR)
					{
					// spieler.sendMessage("Du bist in der Luft!");	
						
					}
					else
					{
						spieler.sendMessage("Du bist gelandet, deine Elytra ist jetzt weg!");
						ItemStack item1 = new ItemStack(Material.AIR, 1);
						ItemMeta met1 =item.getItemMeta();
						item.setItemMeta(met1);
						spieler.getInventory().setChestplate(item1);
							
						
						
						
					}
				
				
				
				
				}
				
				
				
					
				 
			    
					
				}
				
				
					
				
				
				
				
		
		
		return true;	
		
		
		
	}
	
	
	
	
	
	
	
	
	
	
}

 

Edited by Jens Becker
Link to comment
Share on other sites

Du könntest dass onPlayerMoveEvent verwenden und dabei abfragen, ob der Block unter ihm Luft ist. Beachte dabei, dass dieses Event bei jeder Bewegung getriggert wird(Auch beim drehen oder Kopf bewegen) daher würde ich vorher mit getTo() und getFrom() die y Koordinaten vergleichen um zu gucken ob sich die Höhe verändert hat.

 

 

Mfg,

Joey

Link to comment
Share on other sites

vor einer Stunde schrieb Joey:

Du könntest dass onPlayerMoveEvent verwenden und dabei abfragen, ob der Block unter ihm Luft ist. Beachte dabei, dass dieses Event bei jeder Bewegung getriggert wird(Auch beim drehen oder Kopf bewegen) daher würde ich vorher mit getTo() und getFrom() die y Koordinaten vergleichen um zu gucken ob sich die Höhe verändert hat.

 

 

Mfg,

Joey

Okay, danke schonmal, aber ich kenne mich leider noch nicht so gut mit Spigot Programmieren aus. Aber das eigentliche was ich ja brauche ist, dass Das Plugin erst dann anfängt zu prüfen ob Luft unter dem Spieler ist wenn er sich vom Spawn hinunter Stürtzt und fliegt. Und dann sollte die Methode nicht den Server zum abstürzen bringen also denke ich mal kann man schonmal keine Schleife die dauernt überprüft benutzen, oder?

 

Aber wie ich den Block unter dem Spieler überprüft habe, war doch mit diesem Event, oder? Wenn nicht wie macht man es damit. 

P.s.: Ich verwende ein Plugin welches den Spieler während des Elytraflugs, nach Wunsch in die Höhe boosted, gibt es daher vielleicht eine Möglichkeit zu schauen wann der Spieler wieder aufrecht nach dem Flug steht oder so?

Link to comment
Share on other sites

 

vor 2 Stunden schrieb Jens Becker:

prüfen ob Luft unter dem Spieler ist wenn er sich vom Spawn hinunter Stürtzt und fliegt.

Ich würde wie schon erwähnt dass onPlayerMoveEvent nutzen. Klar du kannst so Sachen machen wie dass du dem Spieler am Spawn(Wenn du ihm die Elytra gibst) in ne ArrayList packst und beim Event abfragst ob er in der Array ist. Wenn er dann drin ist und Boden unter den Füßen hat, schmeist du ihn aus der Array raus und löscht die Elytra.

 

 

vor 2 Stunden schrieb Jens Becker:

der Spieler wieder aufrecht

Das müsste ja wenn ein Event sein, ansonsten müsstest du auch das regelmäßig überprüfen

 

 

mfg,

Joey

Link to comment
Share on other sites

vor 17 Stunden schrieb Joey:

 

Ich würde wie schon erwähnt dass onPlayerMoveEvent nutzen. Klar du kannst so Sachen machen wie dass du dem Spieler am Spawn(Wenn du ihm die Elytra gibst) in ne ArrayList packst und beim Event abfragst ob er in der Array ist. Wenn er dann drin ist und Boden unter den Füßen hat, schmeist du ihn aus der Array raus und löscht die Elytra.

 

 

Das müsste ja wenn ein Event sein, ansonsten müsstest du auch das regelmäßig überprüfen

 

 

mfg,

Joey

Ich habe das jetzt so:

package me.Jensis.EinwegElytra;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;



public class EinwegElytra extends JavaPlugin implements Listener 
{

	public void onEnable()
	{
		System.out.println("[EE] GELADEN UND AKTIVIERT");
		Bukkit.getPluginManager().registerEvents(this, this);
	}
	
	
	public void onDisable()
	{
		System.out.println("[EE] DEAKTIVIERT UND ENTLADEN");
		
	}
	
	
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
	{
		if (cmd.getName().equalsIgnoreCase("elytra"))
		{
			    Player spieler = (Player) sender;
		        spieler.sendMessage("Du hast jetzt eine Einweg Elytra an!");
			    ItemStack item1 = new ItemStack(Material.ELYTRA, 1);
				ItemMeta met1 =item1.getItemMeta();
				item1.setItemMeta(met1);
				spieler.getInventory().setChestplate(item1); }
				return true;
				
				}
	
				
				
				
	   @EventHandler
	   public void onPlayerMoveEvent (PlayerMoveEvent event) {
	   Block b1 = event.getPlayer().getLocation().add(0, -1, 0).getBlock();
	   Player p = event.getPlayer();

	  
	   if(b1.getType() == Material.AIR) 
	   {
	    
	    p.sendMessage("Du hast jetzt eine Einweg-Elytra an!");
	    ItemStack item1 = new ItemStack(Material.ELYTRA, 1);
		ItemMeta met1 =item1.getItemMeta();
		item1.setItemMeta(met1);
		p.getInventory().setChestplate(item1);
	   }
	   else
	   {
		
		p.sendMessage("§7Deine Einweg-Elytra ist beim landen kaputt gegangen!");
	    ItemStack item1 = new ItemStack(Material.AIR, 1);
		ItemMeta met1 =item1.getItemMeta();
		item1.setItemMeta(met1);
		p.getInventory().setChestplate(item1);
	   }
	   
	   


}}

Aber wie bekomme ich das jetzt hin, dass er erst mit dem Event prüft ob der Spieler in der Luft ist wenn er die startplattform verlassen hat. (Außerdem soll der Spieler nur auf der Plattform eine Einweg Elytra bekommen können)

Link to comment
Share on other sites

Naja so war das nicht gemeint. Mit dem onPlayerMoveEvent solltest du dem Spieler die Elytra nur wegnehmen. Wann möchtest du dem Spieler denn eine "Einweg"-Elytra geben? Wenn er stirbt und am Spawn respawned oder wie ist das gemeint?

Link to comment
Share on other sites

Hi,

1. Post *hust*

Zitat

-Spieler gibt /elytra ein und bekommt Elytra (funktoiniert)

 

Ganz davon ab, warum nicht gleich den Flugstatus des Players abfragen, wenn die Möglichkeit doch besteht.

... PlayerMoveEvent e

Player p = e.getPlayer();
if (p.isFlying()) {
    - z.B. prüfen, ob in einem Array, wo man einfach alle zwischenspeichert, die fliegen (wie von Joey vorgeschlagen)
}
else {
    - Prüfen, ob in dem Flug-Array und wenn ja, dann daraus entfernen und Elytra wegnehmen
}

 

-Yuki

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...
B
B