Coding mit Java | Java-basierten APIs

  • Ersteller Ersteller ij9F_i0FaF-d9lrDSDDpDbfo
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
Hey Leute,

ich arbeite momentan an einem Nick-Plugin.... Den Spieler zu nicken in Form von Skin, Name über dem Spieler und dem Namen in der TabListe kriege ich des hin!
Jedoch möchte ich auch, damit ich nicht alle Plugins umschreiben muss, dass man den Spieler namen (genickt) auch mit p.getName() bekommt und nicht nur mit p.getDisplayname()!

Ich bin mir sehr sicher, dass das mit Packets umzusetzten (habe es shconmal geschaft(1.7.x)) ist, aber seit der 1.8 hat sich ja vieles verändert!

Wäre sehr geil wenn mit jemand helfen würde und mir erklären würde wie das geht!

Würde sogar auf einem TS oder Skype für genauere Erklärungen erreichbar sein!


MFG

PS: Hier schonmal mein Grundcode (hier aus dem Forum, funzt so aber nicht mehr, da das Field anscheinend nicht exestiert!

Code:
      EntityPlayer eplayer = ((CraftPlayer) Bukkit.getPlayer("crepperFreak123")).getHandle();
      PacketPlayOutNamedEntitySpawn packet = new PacketPlayOutNamedEntitySpawn(eplayer);
      GameProfile profile = new GameProfile(eplayer.getUniqueID(), "Hier_Der_Neue_Name");
      try{
         Field field = packet.getClass().getDeclaredField("b");
         field.setAccessible(true);
         field.set(eplayer, profile);
         for(Player p : Bukkit.getOnlinePlayers()) {
            if(!p.getName().equalsIgnoreCase("crepperFreak123")) {
               EntityPlayer eToSend = ((CraftPlayer) p).getHandle();
               eToSend.playerConnection.sendPacket(new PacketPlayOutEntityDestroy());
               eToSend.playerConnection.sendPacket(packet);
            }
         }
      }catch(Exception e) {
         System.err.println(e);
      }

MFG

@geNAZt @DREAMZii @TheCrealm @jasaush @Sasuke
 
Hallo Liebe Programmierungsasse :)

Ich habe ein Problem mit der durchsichtigkeit der spectator wie auf gomme.
Der Theorie nach muss es klappen, wenn ich die Spieler einfach unsichtbar mache mithilfe eines Potioneffects, die dann alle in ein Team packe und registriere dass:
Code:
Team.setCanSeeFriendlyInvisibles(true);
Wenn ich dann noch das Scoreboard für den jeweiligen Spieler setze, dann müsste es eigentlich klappen. Ich habe das meiner Meinung nach auch genauso gemacht, aber es will nicht funktionieren. Die Spieler sind nicht durchsichtig sondern unsichbar. Dabei ist das board für den Spieler aktiv, er ist im Team und CanSeeFriendlyInvisibles ist auf true. Ich bin ratlos. Wenn jemand von euch eine Idee hat, wie man diesen Fehler beheben kann, dann her damit. Schreibt mir auch mögliche Fehlerquellen, ich muss einfach wieder an etwas ansetzen, was theoretisch noch nicht funktioniert.

Naja soviel dazu, hier ist der Quelltext:

Code:
public class Ghost {

    public static Scoreboard board;
    public static Team ghost;

    public static void init()
    {
        board = Bukkit.getScoreboardManager().getNewScoreboard();
        ghost = board.getTeam("specs");
        if(ghost == null)
        {
            ghost = board.registerNewTeam("specs");
        }
        ghost.setCanSeeFriendlyInvisibles(true);
        ghost.setNameTagVisibility(NameTagVisibility.NEVER);
    }

    public static void addGhost(Player p)
    {
            ghost.addPlayer(p);
            p.setScoreboard(board);
            p.sendMessage("" + p.getScoreboard().getPlayerTeam(p).canSeeFriendlyInvisibles());
            p.sendMessage("" + p.getScoreboard().getPlayerTeam(p).getName());
            p.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 0));
        }


}

Und im RespawnListener wird das hier aufgerufen:

Code:
Bukkit.getScheduler().runTaskLater(Skywars.plugin, new Runnable() {
            @Override
            public void run() {
                Ghost.addGhost(pp);

            }
        },5);

Ich hoffe jemand von euch hat einen Rat. Danke im Voraus.

mfg
Forward_R
Hol dir das MainScoreboard statt nen neues.
 
@CrepperFreak123
Ich habs gerade geschafft :)

Code:
    public void setName(Player player, String name) throws Exception{
       
        EntityHuman entity = ((CraftPlayer)player).getHandle();
       
        GameProfile profile = entity.getProfile();
       
        Field profilefield = profile.getClass().getDeclaredField("name");
       
        profilefield.setAccessible(true);
        profilefield.set(profile, name);
       
    }
 
Guten Mittag zusammen,

nachdem ich das Nick-Plugin nun so weit habe, dass alles klappt.. Stellt sich folgendes Problem:

Nachdem man mehrmals (2 mal) von einem Random Spieler über Mojang die UUID-Anfrage schickt, wird man sofort für 5 min oder so gebannt!
Also kommen Fehler und Bugs!

Wie kann man das beheben?

Benutze die UUIDFetcher klasse von Jofkos aus dem Postcrafter Forum!!


MFG
 
Dann speichere die UUID in eine HashMap und gette sie dort raus, als ständig eine Anfrage zu mojang zu schicken. Zudem verwende ich die Klasse von Janhektor, die auch im Postcrafter Forum zu finden ist.
 
Guten Mittag zusammen,

nachdem ich das Nick-Plugin nun so weit habe, dass alles klappt.. Stellt sich folgendes Problem:

Nachdem man mehrmals (2 mal) von einem Random Spieler über Mojang die UUID-Anfrage schickt, wird man sofort für 5 min oder so gebannt!
Also kommen Fehler und Bugs!

Wie kann man das beheben?

Benutze die UUIDFetcher klasse von Jofkos aus dem Postcrafter Forum!!


MFG


Dann speichere die UUID in eine HashMap und gette sie dort raus, als ständig eine Anfrage zu mojang zu schicken. Zudem verwende ich die Klasse von Janhektor, die auch im Postcrafter Forum zu finden ist.

Das gilt auch allgemein. Solche abfragen, deren Ergebnis sich ja nicht (so schnell) ändert, sind zu 99% in einem Cache zu speichern. Auf einen Server bezogen solltest auch eine Datenbank mit deinen Spielerdaten besitzen um die Daten nicht nur zu einer bestimmten Laufzeit in deiner RAM zu haben, sondern sie dauerhaft zu speichern.
 
Generell sind für solche Sachen Key/Value Caches gedacht. Wir selber benutzen momentan Redis als Cache und das funktioniert super. Ohne einen solchen Cache überlädt man die API von Mojang und die wollen sich natürlich dagegen schützen und wollen den Aufwand von Resourcen dafür minimieren. Aber wie schon gesagt ändern sich die UUIDs zu Namen selten (maximal 1 mal im Monat) und somit kann man diese Daten ordentlich cachen (wobei man sogar bei Mojang anfragen kann wann der Name gewechselt wurde).
 
Hi ;D
Möchte ein C4 Plugin machen.
Aber erstmal ne erklärung:
Also wenn man mit ein TNT rechtklickt wird ein TNT "gedroppt" das liegt dann da rum.
Man kann es nicht aufsammeln (habe ich mit anderen Plugin gemacht, dass Pickup ausstellt)
Wenn man nun rechtklick mit den Ausloeser macht soll das gedroppte Item explodieren.
Und da ist dass problem, wie kann ich es machen das alle droped tnts eine explosion machen.
Mit .CreateExplosion, ist klar.
Aber wie kann ich dass machen dass es bei den Items explodiert.
Bei mir werden alle gedroppen TNTs den DisplayName des Spielers bekommen, heißt wenn ich ein C4 plaziere heißt dieses SuperYoshi1000, sieht man ja nicht.
Und ich möchte halt dass wenn man mit ein Lever rechtsklickt alle mit den Namen des Rechtklickenden Spieler explodieren.
Aber wie gesagt: Wie kann ich es machen das alle droped tnts eine explosion erzeugen.
Code:
package com.github.superyoshi1000.c4;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Item;
import org.bukkit.entity.Snowball;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;



public class Main extends JavaPlugin implements Listener {
   
   public void onEnable() {
     getServer().getPluginManager().registerEvents(this, this);
   }
   
  @EventHandler
  public void onPlayerInteract(PlayerInteractEvent e) {
    if(!(e.getAction() == Action.RIGHT_CLICK_AIR | e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
  if (!(e.getItem().getType() == Material.TNT)) return;
  {
  e.getPlayer().getInventory().removeItem(new ItemStack(Material.TNT, 1));
  e.getPlayer().updateInventory();
   
   
   
  ItemStack c4 = new ItemStack(Material.TNT);
  ItemMeta c4m = c4.getItemMeta();
  c4m.setDisplayName(e.getPlayer().getName());
  c4.setItemMeta(c4m);
  e.getPlayer().getWorld().dropItem(e.getPlayer().getLocation(), c4);
  if(e.getPlayer().getInventory().contains(Material.LEVER)) return;
   
   
   
   
  ItemStack ak = new ItemStack(Material.LEVER, 1);
  ItemMeta akm = ak.getItemMeta();
      akm.setDisplayName("§7Ausloeser");
  ak.setItemMeta(akm);
  e.getPlayer().getInventory().addItem(ak);
  e.getPlayer().updateInventory();
  }
  }
 
 
  @EventHandler

  public void onPlayerInteract1(PlayerInteractEvent e) {
    if(!(e.getAction() == Action.RIGHT_CLICK_AIR | e.getAction() == Action.RIGHT_CLICK_BLOCK)) return;
  if (!(e.getItem().getType() == Material.LEVER)) return;
  {
      e.getPlayer().getWorld().createExplosion(DiePositiondesItems.getLocation(), 10);
  }
  }
 
  @EventHandler
  public void BlockPlace(BlockPlaceEvent event) {
   
  Block block = event.getBlock();
   

  if (block.getType() == Material.TNT | block.getType() == Material.LEVER) {
  event.setCancelled(true);
  }
 }  

}
 
Also ich würde sagen du packst alle tnts mit ihren Locations in eine List und gehst dann mit einer forschleife durch die Liste. Dort erzeugst du dann die Explosion
 
hallo
ich habe eine Frage zu der mysql connection..
nach einigen stunden wenn mein Server mit mysql verbunden ist und ein Befehl ausgeführt wird will mein mysql nicht mehr gehen. ich bekomme immer eine communicationexception..

Code:
caused by: com.mysql.jdbc.exceptions.jdbc4.communicationsexception: the last packet successfully received from the server was
.. danach 85,000 millisekunden usw..
ich habe es bereits mit ?autoReconnect=true versucht beim verbinden.. es hilft einfach nicht.. weiß einer wie das geht bitte bzw. warum trennt sich die verbindung immer? ich weiß nicht ob es sich direkt trennt.. ich bekomme immer exceptions obwohl die verbindung perfekt läuft..

das passiert nur wenn es inaktiv oder so ist..
 
Jedes mal wenn du etwas an MySQL senden willst checken ob die Connection steht, falls nicht neu connecten. Mach zumindest ich so
 
hier ist meine fehlermeldung
http://pastebin.com/d7Vju4ZS
ich habe einen scheduler gestartet der jede 1/2 sekunde überprüft ob eine connection besteht wenn nicht dann neu connecten.. das funktioniert auch nicht.
ich habe hinter dem connection auch ?autoReconnect=true gemacht.
es funktioniert auch nicht. Weiß einer wo der fehler ist bitte?
 
hier ist meine fehlermeldung
http://pastebin.com/d7Vju4ZS
ich habe einen scheduler gestartet der jede 1/2 sekunde überprüft ob eine connection besteht wenn nicht dann neu connecten.. das funktioniert auch nicht.
ich habe hinter dem connection auch ?autoReconnect=true gemacht.
es funktioniert auch nicht. Weiß einer wo der fehler ist bitte?
Hört sich total ressourcensparend an.
 
Zuletzt bearbeitet:
Man kann auch eine Methode für die Abfrage erstellen, die vor dem eigentlichen Abfragen überprüft, ob eine Verbindung besteht. Das ist auf jeden Fall ressourcensparender als der Scheduler und das, was @20skui09 schon gesagt hat.
 
Man kann auch eine Methode für die Abfrage erstellen, die vor dem eigentlichen Abfragen überprüft, ob eine Verbindung besteht. Das ist auf jeden Fall ressourcensparender als der Scheduler und das, was @20skui09 schon gesagt hat.
Genau so hab ich dass ja gemeint :D
 
Status
Für weitere Antworten geschlossen.

Soziale Medien

  • X
  • TikTok

Über uns

  • GommeHD.net ist einer der größten Minecraft-Server der Welt. Dir gefällt unser Server? Dann unterstütze uns durch einen Kauf im Shop!
  • Shop