Minecraft Plugin: Wie kann ich dafür sorgen, dass sich ein gespawnter Villager nicht mehr bewegt und ich beim Spawnen einen <Random> Namen wählen kann?

3 Antworten

Soll man den Namen eingeben können wenn ja dann so...

package Dein.Package;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import Deine.Main.Class;  //Wen nicht in der Main Class geschrieben

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

          if(sender instanceof Player) {

             Player p = (Player)sender;

             if(args.length == 1) {
            
                 if(p.isOp()) {

                     final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);

                     s.setCustomName("§5"+ args[0]);

                     s.setCustomNameVisible(true);
                     
                     

                     final Location loc = s.getLocation();

                     Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(), new Runnable() {

                        @Override

                        public void run() {

                           s.teleport(loc);
                           s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                        }

                     }, 1L, 1L);

                  }
                
             }else
                p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

          }

          return false;
    }
}

wenn nicht sondern wirklich vom Programm aus random dann so...

package Dein.Package;

import java.util.Random;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import Deine.Main.Class;  //Wen nicht in der Main Class geschrieben

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

        if(sender instanceof Player) {

           Player p = (Player)sender;

           if(args.length == 0) {

             if(p.isOp()) {

                 final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);


                 String[] VillagerNames = {"name1", "name2", "name3", "name4", "name5"};

                 s.setCustomName("§5"+ new Random().nextInt(VillagerNames.length));

                 s.setCustomNameVisible(true);



                 final Location loc = s.getLocation();

                 Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(), new Runnable() {

                    @Override

                    public void run() {

                       s.teleport(loc);
                       s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                    }

                 }, 1L, 1L);

              }

           }else
              p.sendMessage("§4Syntax: /DeinBefehl");
  }
  
          return false;
     }
  }

Ich hoffe ich konnte dir Helfen wenn nich dann schreib es noch mal

Woher ich das weiß:Hobby

2sdaw  02.03.2019, 21:56

Ich hab was vergessen wenn du das ganze in der Main Class schreibst dann musst du den classen kram weg lassen

public class test {
   CODE
}
0
XynLP 
Fragesteller
 02.03.2019, 21:57

Danke für deine Hilfe, hat mir sehr geholfen. Geht des ganze mit dem Villiger das er sich nicht bewegt auch ohne dem Scheduler? (Resourcen schonender?) MFG

0
XynLP 
Fragesteller
 02.03.2019, 22:05
@XynLP
Bukkit.getScheduler().scheduleSyncRepeatingTask(main.getPlugin(), new Runnable() {

                      @Override

                      public void run() {

                         s.teleport(loc);
                         s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                      }

                   }, 1L, 1L);

                }
              
           }else
              p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

        }

        return false;
  }

Bei mir wird das (main.getplugin) rot unterstrichen warum?

0
2sdaw  02.03.2019, 22:26
@XynLP

Ich glaube schon der Effekt würde aber nach ner langen zeit aufhören und er würde wieder im normalen tempo laufen du könntest natürlich auch die Zeit(erster Int) ändern das wehre kein Problem aber er würde zwar langsam vom pfleck kommen aber eben nor sehr langsam da er nicht mehr Teleportiert wird igend wann (nach langer Zeit) wehre der Villager auf einen anderen Block. Aber theoretisch sollte es funktionieren

0
XynLP 
Fragesteller
 02.03.2019, 22:29
@2sdaw

Ich hab irgendwo gelesen man kann dem Villager mit

.setAI(false);

dem Villager seine Funktionen entfernen (Bewegung... ect.) würde das auch klappen?

0
2sdaw  02.03.2019, 22:55
@XynLP

Du musst noch den CommandExecutor implementieren wenn du das noch nicht gemacht hast

Jetzt zu deiner Frage:

Ah jetzt wo du es sagst ich habe lange danach gesucht wollte es in meiner Antwort schon sagen habe es igend wie ni gefunden aber Ja aber dadurch kann man auch nicht in das Inventar des Villagers gucken

0
2sdaw  02.03.2019, 23:00
@XynLP

Ich habe da sone Methode aber das prinzip ist das bei dir

main.getInstance()
0
XynLP 
Fragesteller
 02.03.2019, 23:13
@2sdaw

Danke für deine Antworten ^^

Zwei kleinigkeiten hätte ich nocht.

Wie stelle ich, dass mit dem

.setAI(false);

am besten an oder wo soll ich das dazu schreiben?

Und bei

 s.setCustomName("§5" + args[0]);

Kann ich da auch bei "§5" eine ID über den Befehl einsetzen z.b. "§4" Test oder "§3" Villager ect?

0
2sdaw  03.03.2019, 10:16
@XynLP

Ja du musst oben in der Zeile

if(args.length == 1){

zu

if(args.length >= 1){

ändern und nach der Zeile

 final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);

das folgende hinzufügen

String name = "";
  for(int  i = 0; i < args.length; i++) {
  if(i != args.length) {
    name = name + args[i] +" ";
  }else
    name = name + args[i];
  }

und die Zeile

s.setCustomName("§5"+ args[0]);

ersetzen durch

 s.setCustomName(name.replace("&", "§"));

und nun wird es so sein das man statt §[Farbcode] jetzt &[Farbcode machen muss so kannst du die Farbe ingame ändern

1
XynLP 
Fragesteller
 03.03.2019, 11:58
@2sdaw

Danke für deine Große Hilfe ^^

0
2sdaw  03.03.2019, 12:11
@XynLP

Ach selbs verständlich, und Danke für die Positiven Bewertungen ;-)

Hast du das ganze verstanden?

0
XynLP 
Fragesteller
 03.03.2019, 12:28
@2sdaw

Verstanden und umsetzen konnte ich es, hast du super erklärt besser als so manches Java learn Book oder Programmier Youtuber xD

Ich frag mich immer noch wie ich den Villager Resourcen Schonender am gleichen Fleck stehen lassen kann aber das finde ich noch raus irgendwie (hoffentlich) xD

0
2sdaw  03.03.2019, 12:40
@XynLP

Oh das hab ich noch nicht erklert Sorry

Dein Villager hat ja die Variable "s" also mit .setAI(false) würde das gehen

s.setAi(false)

dann solte das ganze gehen (daduch kannst du nicht mehr in das Inventar sehen)

0
XynLP 
Fragesteller
 03.03.2019, 12:50
@2sdaw

Das Inventar brauch ich nicht da bei Rechstklick auf den Villager ein Inventar erstellt werden soll ^^

0
XynLP 
Fragesteller
 03.03.2019, 12:51
@2sdaw

The method setAi(boolean) is undefined for the type Villager

Wird rot unterstrichen, komisch :/

0
2sdaw  03.03.2019, 12:55
@XynLP

Ah Ah Ah du musst das i groß schreiben

s.setAI(false);
0
XynLP 
Fragesteller
 03.03.2019, 12:56
@2sdaw

Bleibt trotzdem rot xD

0
2sdaw  03.03.2019, 13:08
@XynLP

Lol bei mir steht das du was kommentiert hast und ich finde es ni :(

0
2sdaw  02.03.2019, 23:11

Du musst diese folgende Zeile noch ändern (wenn du das vom Programm aus random nimmst) da sonst dir nur ne random Zahl gegeben wird

 s.setCustomName("§5"+ VillagerNames[new Random().nextInt(VillagerNames.length)]);

hab nicht richtig nachgedacht aber sonst würde das so funktionieren

0
XynLP 
Fragesteller
 02.03.2019, 23:27
@2sdaw
public class test {
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

          if(sender instanceof Player) {

             Player p = (Player)sender;

             if(args.length == 1) {
            
                 if(p.isOp()) {

                     final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);

                     s.setCustomName("§5"+ args[0]);

                     s.setCustomNameVisible(true);
                     
                     

                     final Location loc = s.getLocation();

                     Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getPlugin(), new Runnable() {

                        @Override

                        public void run() {

                           s.teleport(loc);
                           s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                        }

                     }, 1L, 1L);

                  }
                
             }else
                p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

          }

          return false;
    }
}

Ich hab diese Version vom Programm verwendet.
möchte nun auch die Farbe vom Displayname in Game einstellen können.

0
2sdaw  02.03.2019, 23:44

Sag ich dir Morgen ok ;)

1

@2sdaw

 package me.BukkitXyn.Villager.at;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import me.BukkitXyn.Main.at.main;


public class CMD_SkeletonSpawn implements CommandExecutor {

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

        if(sender instanceof Player) {

           Player p = (Player)sender;

           if(args.length >= 1) {
          
               if(p.isOp()) {

                   final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);
                   
                   String name = "";
                   for(int  i = 0; i < args.length; i++) {
                   if(i != args.length) {
                     name = name + args[i] +"";
                   }else
                     name = name + args[i];
                   }

                   s.setCustomName(name.replace("&", "§") + args[0]);

                   s.setCustomNameVisible(true);
                 
                   
                   final Location loc = s.getLocation();


                   Bukkit.getScheduler().scheduleSyncRepeatingTask(main.getPlugin(), new Runnable() {

                      @Override

                      public void run() {
                          
                         s.teleport(loc);
                         s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                      }

                   }, 1L, 1L);

                }
              
           }else
              p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

        }

        return false;
  }

}

2sdaw  03.03.2019, 13:29

Die Zeile

s.setCustomName(name.replace("&", "§") + args[0]);

ist falsch (sorry) das

 + args[0]

muss weg da darf nur noch das folgenede stehen

s.setCustomName(name.replace("&", "§"));
1
XynLP 
Fragesteller
 03.03.2019, 13:32
@2sdaw

Ich hab den Fehler xD

0
2sdaw  03.03.2019, 13:34
@XynLP

ok war das das was ich gesagt habe??

Habe dir zu einer deiner forherigen Fragen geantwortet da wo du nur eine Antwort war welche ni hilfreich war ;)

0
XynLP 
Fragesteller
 03.03.2019, 13:36
@2sdaw

Jaaa, ist mir aufgefallen als ich mir das oben nochmal durchgelesen habe xD

0
2sdaw  03.03.2019, 13:33

Ach und wenn du die Zeile mit

}else
  p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

nicht brauchst dann kannst du die auch weg machen ABER nur bis zu dem Zeichen: "}" PS: zeigt dem Spieler nur wie der Syntax von dem Befehl ausschaut (wen er was falsches eingegeben hat

1
XynLP 
Fragesteller
 03.03.2019, 13:35
@2sdaw
package me.BukkitXyn.Villager.at;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import me.BukkitXyn.Main.at.main;


public class CMD_SkeletonSpawn implements CommandExecutor {

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

        if(sender instanceof Player) {

           Player p = (Player)sender;

           if(args.length >= 1) {
          
               if(p.isOp()) {

                   final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);
                   
                   String name = "";
                   for(int  i = 0; i < args.length; i++) {
                   if(i != args.length) {
                     name = name + args[i] +"";
                   }else
                     name = name + args[i];
                   }

                   s.setCustomName(name.replace("&", "§") + args[0]);

                   s.setCustomNameVisible(true);

                   s.setAI(false); //wird rot unterstrichen Fehler: The method setAI(boolean) is undefined for the type Villager
                 
                   
                   final Location loc = s.getLocation();


                   Bukkit.getScheduler().scheduleSyncRepeatingTask(main.getPlugin(), new Runnable() {

                      @Override

                      public void run() {
                          
                         s.teleport(loc);
                         s.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 35600, 35600, true, false));
                      }

                   }, 1L, 1L);

                }
              
           }else
              p.sendMessage("§4Syntax: /DeinBefehl <VillagerName>");

        }

        return false;
  }

}

0
2sdaw  03.03.2019, 13:38
@XynLP

Welche Version benutzt ihr (Server version) und benutzt du Eclipse?

0
XynLP 
Fragesteller
 03.03.2019, 13:41
@2sdaw

Ich benutze Eclipse, Server Version Spigot 1.8.8

0
2sdaw  03.03.2019, 13:48
@XynLP

wenn du das mit

s.setAI(false);

wegmachst und nur "s." schreibst beckommst du ja ne tauswahl schreibe dan mal weiter "set" (nach dem Punkt) wird dir da etwas vorgeschlagen??

0
2sdaw  03.03.2019, 13:54
@XynLP

Ok ich weiß warum: ich habe es in der 1.13.2 Programmiert diese Methode ist noch recht neu und man kann sie nicht in der 1.8.8 benutzen

0
XynLP 
Fragesteller
 03.03.2019, 13:56
@2sdaw

Asooo, bedeutet nun für mich keine Resourcen schonung?

0
2sdaw  03.03.2019, 14:04
@XynLP

Da kann ich dir leider nicht weiter helfen villeicht gibt es im Internet eine API zu der Methode die du in dein Projekt nehmen musst aber da kann ich dir leider nicht weiter helfen

Tut mir leid ;(

0
XynLP 
Fragesteller
 03.03.2019, 14:06
@2sdaw

Schon ok ^^ Es ich glaub nicht das mir die Villiger meinen Server mit 12 Kernen und 64 GB Ram in die Knie zwingen wird... xD

Das doofe ist einfach nur, dass nach einem Reload die Villiger aus dem Scheduler rausfallen und sich dadurch wieder bewegen :/

0
2sdaw  03.03.2019, 14:18
@XynLP
package Dein.Package;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;

import net.minecraft.server.v1_8_R3.NBTTagCompound;

public class DeineClasse implements CommandExecutor{

   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {

        if(sender instanceof Player) {

           Player p = (Player)sender;

           if(args.length >= 1) {

             if(p.hasPermission("Plugin.admin.Villager")) {

                 final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);

                 String name = "";
                 for(int i = 0; i < args.length; i++) {
                    if(i != args.length) {
                     name = name + args[i] +" ";
                  }else
                     name = name + args[i];
                 }

                 s.setCustomName(name.replace("&", "§"));

                 s.setCustomNameVisible(true); 
                 net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity) s).getHandle();
                 NBTTagCompound tag = nmsEntity.getNBTTag();
                 if (tag == null) {
                    tag = new NBTTagCompound();
                 }
                 nmsEntity.c(tag);
                 tag.setInt("NoAI", 1);
                 nmsEntity.f(tag);

              }

          }else
             p.sendMessage("§4Synatx: /DeinBefehl <VillagerName>");

        }

        return false;
 }

}

brobier es mal so das ist so ne art setAI() nur komplezierter und funktioniert mit der 1.8.8

vllt ist das

net.minecraft.server.v1_8_R3.Entity

bei dir anders dann schreib mir ne private Nachicht

1
2sdaw  03.03.2019, 15:40
@XynLP

Nein die Villager würden den Effekt noch haben da er für ne lange zeit gegeben wurde, Manche sagen auch wenn man nen ganz großen Wert bei der Dauer eingeben würde das der Effekt für immer ist (wert ~1000000) aber das weiß ich nicht wnn man ja nen spieler mit dem Minecraft Command nen Effekt gibt und als länge die höste Zahl eingibt dann stehen da ja **:** als zeit (Inventar geöffnet ohne Crafting Rezepte Liste) ob das stimmt das das für immer dann ist weiß ich wie gesagt nicht genau vllt ist es auch nur so da Minecraft so große Zahlen nicht anzeigen kann. ;)

0

Lad dir doch einfach den NPC Plugin runter. Damit kann man so gut wie alles machen.