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?
Hey liebe Programmiergemeinde,
ich bin gerade dabei, für meinen Server ein Plugin zu programmieren, welches einen Villager, der sich nicht bewegt, spawnt und diesem einen Displayname gibt.
Nun zu meiner Frage:
Ich bin soweit, dass der Villager gespawnt wird und der Displayname über seinen Kopf erscheint (diesen Namen soll man am Ende beim Spawnen festlegen können).
Der Villager wird gespawnt und immer wenn er sich bewegt, durch einen Scheduler wieder an seinen "Spawn-Point" zurückgesetzt. Jedoch nickt der Villager immer und ich weiß nicht, wie ich das ausschalten kann. (Es soll am Ende wie auf Mineplex oder Gomme sein).
Weiß jemand, wie ich es hinbekomme, dass der Villager sich gar nicht mehr bewegt und ich beim Spawnen einen <Random> Namen wählen kann?
Code:
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (sender instanceof Player) {
Player p = (Player)sender;
if (p.isOp()) {
final Villager s = (Villager) p.getWorld().spawnEntity(p.getLocation(), EntityType.VILLAGER);
s.setCustomName("§5Test");
s.setCustomNameVisible(true);
final Location loc = s.getLocation();
Bukkit.getScheduler().scheduleSyncRepeatingTask(main.getInstance(), new Runnable() {
@Override
public void run() {
s.teleport(loc);
}
}, 1L, 1L);
}
}
return false;
}
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
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
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.
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
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?
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
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
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?
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
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
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
}
@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;
}
}
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
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;
}
}
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 :/
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
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. ;)
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("&", "§"));
Lad dir doch einfach den NPC Plugin runter. Damit kann man so gut wie alles machen.
Sag ich dir Morgen ok ;)