• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

SignJoinPlayer

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
Heyy Leute

Ich bin gerade dabei ein ffa plugin zu programmieren! Alles hat gut geklappt bis das signjoin kam! Alles klappt auch das teleportieren wenn man rechtsklick macht, nur nicht die anzhal der spieler, die gejoint sind!
Also: x/25
Somit hätte ich gerne ein paar tipps oder wenn möglich auch den code wie man das macht, dass wenn jemand joint x + 1 ist und wenn jemand leavt x - 1. zudem sollen natürlich auch nicht mehr als 25 spieler joinen!

Bitte hilfe!
Mfg
 

FelixKlauke

Erzengel
Ehem. Teammitglied
Registriert
5 Januar 2014
Beiträge
1.038
Diamanten
299
Minecraft
FelixKlauke
Du musst einfach veim Interactevent ueberpruefen, ob die Zahl aller inGamespieler 25 bzw kleiner ist. Danach zaehlst du x+1 und holst dir das Schild. Dann setz du die entsprechende Zeile auf "["+x+"/"+"25]" und updatest das Schild. Umgekehrt zaehlst du sie runter.:Wenn jemand die arena leavt setzt du die Variable zurueck und updatest das Schild. Aber ich wuerd mir aich ne boolean "Joinable" machen. So kannst du noch einfacher sagen ob jemabd joinen darf, weil sonst kann es passieren, dass jemand in ein laufendes Spiel stolpert
 

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
Danke als erstes mal für die antwort!

So habe ich es aber leider schon probiert und wenn die arena voll war, dann ging die spielerzahlt nicht mehr runter!
Wie kann ich zudem machen, dass ich auch außerhalb des signevents das schild updaten kann?

Mfg
 

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
Oke.. Sollte klappen (bin gerade nich am pc) aber wieso zählt x nicht mehr einen runter, wenn die spieleranzahl voll ist! Also 25/25 oder 20/20?
könnte dir der script da vlt. Weiterhelfen? Wenn ja kann ich ihn dir heute abend schicken :)

MFG
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
Oke.. Sollte klappen (bin gerade nich am pc) aber wieso zählt x nicht mehr einen runter, wenn die spieleranzahl voll ist! Also 25/25 oder 20/20?
könnte dir der script da vlt. Weiterhelfen? Wenn ja kann ich ihn dir heute abend schicken :)

MFG

Leg dir eine HashMap an in deiner Main class , diese lässt du per Methode ausgeben.
zB so in etwa :

Code:
private HashMap<String, Integer> _playerHash = new HashMap<>();

public HashMap<String, Integer> getOnlineHash() {
return _playerHash;
}

Nun kannst du diese im PlayerInteract Event abrufen , fragen wieviele drin sind und ggf einen beifügen oder es eben lassen.

Nun musst du in deinem Verlassen des Events natürlich den spieler immer wieder daraus streichen.
So hast du Public zugriff dadrauf,
 

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
Warum sollte man die Spieler als String speichern? Man kann auch gleich den Spieler Speichern.
Code:
HashMap<Player, Integer>
-
Wozu braucht man überhaupt ein Integer für jeden Spieler? Am einfachsten ist es, wenn man die Spieler in einer List<Player> abspeichert. Und dann bekommt man von der Methode "size()" die Spieleranzahl zurück.
 

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
Warum sollte man die Spieler als String speichern? Man kann auch gleich den Spieler Speichern.
Code:
HashMap<Player, Integer>
-
Wozu braucht man überhaupt ein Integer für jeden Spieler? Am einfachsten ist es, wenn man die Spieler in einer List<Player> abspeichert. Und dann bekommt man von der Methode "size()" die Spieleranzahl zurück.


Da es bei Events meist um mehrere Areas geht, war das HashMap<String, Integer> _playerHash = new HashMap<>(); dazu gedacht um dort die aktuelle Spieleranzahl in der Arena zu definieren.

_playerHash.put("ArenaName", SpielerInArena);
 

MiCrJonas

Threadripper
Registriert
29 Oktober 2012
Beiträge
1.064
Diamanten
0
Dann wäre es aber einfacher, die Spieler sofort in dieser Map zu speichern und nicht die Anzahl der Spieler, weil diese sowieso noch irgendwo gespeichert werden muss.

Code:
HashMap<String, List<Player>> ingamePlayers;
-
Dann kann man einfach wie folgt die Spieler in einer Arena herausfinden:
Code:
String arena = "Arena1";
ingamePlayers.get(arena).size();
 
Zuletzt bearbeitet:

Pappi

Schafhirte
Gesperrt
Registriert
28 Oktober 2012
Beiträge
141
Alter
40
Diamanten
0
Minecraft
Pappi / PapaHarni
Dann wäre es aber einfacher, die Spieler sofort in dieser Map zu speichern und nicht die Anzahl der Spieler, weil diese sowieso noch irgendwo gespeichert werden muss.

Code:
HashMap<String, List<Player> ingamePlayers;
-
Dann kan man einfach so die Spieler in einer Arena herausfinden:
Code:
String arena = "Arena1";
ingamePlayers.get(arena).size();

Joa das ist wahr. Wobei wenn dann bitte richtig :-D

Code:
HashMap<String, List<Player>[B][COLOR="#FF0000"]>[/COLOR][/B] _ingamePlayers[B][COLOR="#FF0000"] = new HashMap<>()[/COLOR][/B];
 

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
HashMaps

Heyy

erstmal danke dafür das ihr hier alle so helft :)
Aber meine Frage wäre jetzt, da ich

noch nicht so lange mit java zu gange bin, was eine hashmap ist und wie ich sie in dem Zusammenhang gebrauche :) :$:$

MFG

ps: immer noch am Handy :)
 

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
Code:
package Listener;

import java.io.File;
import java.util.ArrayList;

import me.xxPluginerx.MAPvp.Main;

import org.apache.logging.log4j.core.jmx.Server;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;

import Commands.Arena1;

public class SignJoin1 implements Listener, CommandExecutor{


	int SpielerArena1 = Main.Spieler1;

	public static ArrayList<String> PlayerInGame = new ArrayList<>();
	
	public static File arena1 = new File("plugins/MAPvp/Arenas/Greenland1.yml");
	public static FileConfiguration cfg = YamlConfiguration.loadConfiguration(arena1);

	@EventHandler
	public void onInteract(PlayerInteractEvent e){
		Player p = e.getPlayer();
		if(e.getAction() == Action.RIGHT_CLICK_BLOCK){
			if(e.getClickedBlock().getState() instanceof Sign){
				final Sign s = (Sign) e.getClickedBlock().getState();
				if(s.getLine(0).equalsIgnoreCase("[Greenland]")){
					if(s.getLine(1).equalsIgnoreCase("Arena 1")){
					if(p.getLevel() < 5 || p.getLevel() == 5){

		
		

						Location loc1 = p.getLocation();
						double x = (double) cfg.get("PosX", loc1.getX());
						double y = (double)cfg.get("PosY", loc1.getY());
						double z = (double)cfg.get("PosZ", loc1.getZ());
						double yaw = (double) cfg.get("Yaw", loc1.getYaw());
						double pitch = (double) cfg.get("Pitch", loc1.getPitch());
						String worldName = cfg.getString("World");
						
						World world = Bukkit.getWorld(worldName);
						
						loc1.setWorld(world);
						loc1.setX(x);
						loc1.setY(y);
						loc1.setZ(z);
						loc1.setYaw((float) yaw);
						loc1.setPitch((float) pitch);
						
						p.teleport(loc1);
						
						
						p.sendMessage("§aDu bist der Arena erfolgreich beigetreten");
						s.update(true);
	

				
						SpielerArena1 = Main.add++ + 1;
						
					    Integer meinInteger = new Integer(SpielerArena1);
					    String Spieler1s = meinInteger.toString(); 
						
					    s.setLine(2, Spieler1s + "/" + Main.MaxSpieler);
					    
					    s.setLine(3, "");
							s.update();
							
						
					}else{
						p.sendMessage("§6[MAPvp]Du hast nicht das erforderliche Prestige!");
						s.update(true);
					}

				}
					
				}

			}
		}

	}


	

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label,
			String[] args) {


		
		if(cmd.getName().equalsIgnoreCase("Spawn")){
			
			if(sender instanceof ConsoleCommandSender){
				
			System.out.println("Dieses Command können nur Spieler verwenden!");	
			return true;
			}
			Player p = (Player) sender;
			
			if(args.length == 0){
			
				p.sendMessage("§4[MAPvp]Du hast erfolgreich die Arena verlassen!");
				SpielerArena1 = Main.add-- - 1;
				PlayerInGame.remove(p.getName());
			
			
				
				return true;
			
			}
			
		}
	
		if(cmd.getName().equalsIgnoreCase("hub")){
			
			if(sender instanceof ConsoleCommandSender){
				
			System.out.println("Dieses Command können nur Spieler verwenden!");	
			return true;
			}
			Player p = (Player) sender;
			
			if(args.length == 0){
			
				
				p.sendMessage("§4[MAPvp]Du hast erfolgreich die Arena verlassen!");
				SpielerArena1 = Main.add-- -1;
				PlayerInGame.remove(p.getName());
	
				
				return true;
			
			}
			
		}
		return false;
	}






@EventHandler
public void onLeave(PlayerQuitEvent e){
	Player p = e.getPlayer();
	
		SpielerArena1 = Main.add-- -1;
		PlayerInGame.remove(p.getName());

}
}

Hier ist der Code!
Könnte vlt. jemand das mal einfügen, also mit der Hashmap, weil ich verstehe das noch nicht ganz!
Zudem wäre es nett wenn mir jemand erklärt wie ich in den Commands auf das Schild zugreife!

MFG
 
Zuletzt bearbeitet:

xxProgramerx

Minecrafter
Registriert
16 März 2014
Beiträge
26
Diamanten
0
Also du siehst ja in dem Code bei dem erstes Event dieses Zeile:

Code:
final Sign s = (Sign) e.getClickedBlock().getState();

Und genau dieses Schild möchte ich zu dem Command Spawn und hub übergeben und es dann da mit s.update(); updaten!

Leider weis ich nicht wie das gehen soll!

MFG
 
Oben