• 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!

Ein paar Fragen / Codesuche für Eclipse

Mrcookie008

Braumeister
Registriert
15 Dezember 2011
Beiträge
380
Diamanten
0
Minecraft
xCookieZz oder Mrcookie008 (Beides Premium)
Heyho Leute:)

Da ich grade sehr viel an meinem neuen Plugin arbeite , wollte ich auch 2 neue "Funktionen" einbauen , zum einen ist dass AntiSpam und AntiCaps , beides sollte ganz einfach funktionieren:

Antispam:
Wird ein beliebiger Text mehr als 3 mal hintereinander geschrieben , wird er nach dem 3. mal nichtmehr gesendet , der spieler bekommt per p.sendMessage eine Nachricht das Spamen verboten ist.

AntiCaps:
Wenn mehr als 50% des Textes Grossgeschrieben werden wird die Message nicht gesendet und er bekommt wieder eine Nachricht das Caps verboten sind.

Da ich leider nirgens irgentwelche hinweiße auf Tutorials oder hilfe zu diesen 2 Befehlen gefunden habe frage ich euch deshalb.
Hat evt. jemand von euch den Code der 2 Funktionen irgentwo rumliegen oder könnte mir das erklären?


Problem Nr2.

Ich habe folgenden Code , der als Countdown dient:

Code:
		        int starter = 0;
				if(cmd.getName().equalsIgnoreCase("ct")){
					if(p.hasPermission("ct.ct")){
					if(args.length == 0){
						p.sendMessage("§cFalsch! Versuch mal: /ct <Zeit> - Also z.B /ct 10" );
						
					} else {
						starter = Integer.parseInt(args[0]);
						Bukkit.broadcastMessage("             " + "§2[]----- " +"§aDer Chat wird gereinigt in: " + "§2-----[]");
						while (starter != 0) {
							Bukkit.broadcastMessage("                                 " + ChatColor.DARK_GREEN + "" + starter + "§a sekunden");
							starter--;
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
							
						}
						if (starter == 0) {
							Bukkit.broadcastMessage("Hier kommen noch leerzeilen hin , hab ich eben weg gemacht..");
							Bukkit.broadcastMessage("§2-----------------------------------------------------");
				            p.sendMessage("        " + "§2[]-----" + "§aDer Chat wurde von §e" + p.getName() + "§2gereinigt");
							Bukkit.broadcastMessage("§2-----------------------------------------------------");						
						}
					}
				}
			}
		        else {
		        }
		        return true;
		      }

Problem: Solange der Countdown abläuft , kann niemand etwas schreiben oder einen Befehl eingeben , die Nachrichten kommen erst nach dem Countdown an.. bitte um hilfe :/


Danke im vorraus.

LG.
 

Mrcookie008

Braumeister
Registriert
15 Dezember 2011
Beiträge
380
Diamanten
0
Minecraft
xCookieZz oder Mrcookie008 (Beides Premium)

Calenria

Braumeister
Registriert
28 Juli 2012
Beiträge
386
Alter
42
Diamanten
150
Minecraft
Calenria
Erstmal Sorry^^

Bloss er hat ein anderes Problem :/...

Trotzdem danke..

Das ist das du den Thread Schlafen legst. wenn du das tust schläft der ganze Server, deshalb einfach in einem AsyncTask starten. Das trifft doch dein Problem recht genau oder hab ich das Falsch verstanden?

Für AntiCaps einfach RegEx benutzen und für AntiSpam pro User nen Array mit den letzten Nachrichten speichern, sollte kein Problem sein.
 

Crafter6432

Workaholic
Registriert
22 Dezember 2011
Beiträge
681
Diamanten
0
Code:
private double capsPercent(String text){
		double upper = 0;
		double letters = 0;
		for (int i = 0; i < text.length(); i++) {
			 if(Character.isLetter(text.charAt(i))){
				 letters++;
			 }
			 if(Character.isUpperCase(text.charAt(i))){
				 upper++;
			 }
		}
		return (upper/letters*100);
	}
 

Mrcookie008

Braumeister
Registriert
15 Dezember 2011
Beiträge
380
Diamanten
0
Minecraft
xCookieZz oder Mrcookie008 (Beides Premium)
Code:
private double capsPercent(String text){
		double upper = 0;
		double letters = 0;
		for (int i = 0; i < text.length(); i++) {
			 if(Character.isLetter(text.charAt(i))){
				 letters++;
			 }
			 if(Character.isUpperCase(text.charAt(i))){
				 upper++;
			 }
		}
		return (upper/letters*100);
	}

Erkennt als fehler:

capsPercent

und

(upper/letters*100);


Lösungen gibt es keine
 
C

Chrisliebaer

Guest
Wieso so aufwendig? Das geht ganz easy. Für jeden großen Buchstaben zählst du eine Variable runter (--). Und für jeden kleinen Buchstaben zählst du DIE SELBE Variable eins hoch (++)

Wenn deine Variable > 0 => Alles okay
Wenn deine Variable < 0 => mehr als die hälfte Caps

Da brauchst du weder mit Gleitkommazahlen arbeiten, noch mit Prozenten rechnen.


Und außerdem ist das was du da gemacht hast ganz gefährlich, wenn jemand eine leere Nachricht (ich denke das dürfte mit nem Hack möglich sein) oder nur Leerzeichen sendet, dann Crasht das sogar, da du dann durch 0 teilen musst.
 
Zuletzt bearbeitet von einem Moderator:
C

Chrisliebaer

Guest
Warum auch immer ich mich gerade nicht selbst zitieren kann. Naja, Code bekommst du von mir nicht, ich finde das muss man selbst schreiben. Aber ich schon sagte:

Die Schleife, die alle Buchstaben der Nachricht durchläuft ist schonmal richtig. Und nun kann man das aber ganz leicht vereinfachen. Dich interessiert ja garnicht, ob mehr als 50% Caps ist. Du möchtest wissen, ob mehr große, als kleine Buchstaben drin sind. Und das kannst du einfach so machen, dass du alle Buchstaben mit der Schleife prüfst:

Für jeden großen Buchstaben zählst du eine Variable runter (--). Und für jeden kleinen Buchstaben zählst du DIE SELBE Variable eins hoch (++)

Wenn du die Schleife verlassen hast kannst du deine Variable prüfen.

Wenn deine Variable > 0 => Alles okay
Wenn deine Variable < 0 => mehr als die hälfte Caps

Wenn man das ganze in Pseudocode schreiben will:
Code:
$verhältsnis = 0;
Für jeden $Buchstabe von $Nachricht;
{
	Wenn $Buchstabe.großerBuchstabe:
		$verhältnis--;
	Ansonsten:
		$verhältnis++;
}
Wenn $verhältnis < 0:
	// nachricht ist capslock
Anonsten
	// anchricht ist kein capslock

Es hilft manchmal, wenn sich sich einfach so einen String auf Papier schreibt und dann mal selbst überlegt, was der Code macht.
 
Zuletzt bearbeitet von einem Moderator:

psygate

Minecrafter
Registriert
24 Februar 2013
Beiträge
1
Diamanten
0
Ich glaube ja, dass man am besten lernt zu Coden, wenn man gute Beispiele vorgelegt kriegt. Manchmal hilft vollständig mehr als nur halbvollständig. Hier hab' ich dir eine meiner Klassen zusammengesucht, die genau das macht, was du willst. Die musst du theoretisch nur noch als Modul reinkloppen und passt. (solange du Bukkit verwendest.)

Code:
package com.psygate.chat.chatguards;

import java.util.HashMap;

import org.bukkit.event.EventHandler;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class ChatSpamGuard {
	private HashMap<String, String> messages = new HashMap<String, String>();
	private HashMap<String, Integer> tokens = new HashMap<String, Integer>();
	
	@EventHandler
	public void chatEvent(AsyncPlayerChatEvent event) {
		if(checkForTriple(event)) {
			event.getPlayer().sendMessage("§6Stop spamming.§6");
			event.setCancelled(true);
		} else if(checkForAllCaps(event)) {
			event.getPlayer().sendMessage("§6Stop spamming.§6");
			event.setCancelled(true);
		}
	}

	private boolean checkForAllCaps(AsyncPlayerChatEvent event) {
		String message = event.getMessage();
		float length = message.length();	//float is wichtig, sonst kriegste am Ende nichts sinnvolles raus.
		int capscount = 0;
		for(int i = 0; i < message.length(); i++) {
			char chr = message.charAt(i);
			if(chr == Character.toUpperCase(chr)) {
				capscount++;
			}
		}
		
		return ((capscount/length) >= 0.5);
	}

	private boolean checkForTriple(AsyncPlayerChatEvent event) {
		String message = event.getMessage();
		String player = event.getPlayer().getName();
		if(messages.containsKey(player) && messages.get(player).equals(message)) {
			tokens.put(player, tokens.get(player) + 1);
			if(tokens.get(player) >= 3) return true;
		} else if(messages.containsKey(player) && !messages.get(player).equals(message)) {
			tokens.put(player, 0);
		} else {
			messages.put(player, message);
			tokens.put(player, 0);
		}
		
		return false;
	}
}

Edit: Öha, If-Branch vergessen. Ich bin so pro -.-
 
S

ServerPvP

Guest
Code:
public void Countdown(final int sec){
		taskidcd = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new BukkitRunnable() {
		    int seconds = sec;
			public void run(){
		        if (seconds > 0){
		            if (seconds == 60){
			        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
		            }
		            if (seconds == 30){
			        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
		            }
		            if (seconds == 10){
			        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
		            }
		            if (seconds == 5){
			        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds + " §aSekunden!");
		            }
		            if (seconds <= 3){
			        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aNoch §6" + seconds +  (seconds == 1 ? " §aSekunde!" : " §aSekunden!"));
		            }
		            seconds--;
		        }else{
		        	Bukkit.getServer().broadcastMessage("§7[§cCount§aDown§7] §aDie Zeit ist abgelaufen!");
		            Bukkit.getScheduler().cancelTask(taskidcd);
		        	taskidcd = 0;
		           }
		        }
		},0L, 20L);
	}

Den Main Thread kann man nicht zum schlafen setzen. Dafür benutzt man SyncDelayedTasks.
Falls welche wieder fragen:
- BukkitRunnable statt Runnable da BukkitRunnable bei einem Reload auch entgültig gestoppt wird
- final int sec da die Variabel "sec" nicht mehr modifiziert wird
- Dies ist eine Methode, man muss sie mit zB CountDown(5); ausführen

MfG ServerPvP
 
Oben