2025-03-25 17:02:41 +01:00
|
|
|
package game.command;
|
|
|
|
|
|
|
|
import java.util.List;
|
2025-03-25 23:10:40 +01:00
|
|
|
import java.util.Set;
|
2025-03-25 17:02:41 +01:00
|
|
|
|
|
|
|
import game.collect.Lists;
|
2025-03-25 23:10:40 +01:00
|
|
|
import game.collect.Sets;
|
2025-03-25 17:02:41 +01:00
|
|
|
import game.entity.Entity;
|
|
|
|
import game.entity.types.EntityLiving;
|
|
|
|
import game.init.EntityRegistry;
|
|
|
|
import game.network.NetHandlerPlayServer;
|
|
|
|
import game.world.WorldServer;
|
|
|
|
|
|
|
|
public class EntityListParser extends EntityParser {
|
|
|
|
public EntityListParser(String name, boolean useSender, boolean livingOnly) {
|
|
|
|
super(name, useSender, livingOnly);
|
|
|
|
}
|
|
|
|
|
2025-03-25 23:10:40 +01:00
|
|
|
public Object parse(CommandEnvironment env, String input) {
|
2025-03-25 17:02:41 +01:00
|
|
|
if(input.equals("**")) {
|
|
|
|
List<Entity> list = Lists.newArrayList();
|
|
|
|
for(WorldServer world : env.getServer().getWorlds()) {
|
|
|
|
if(this.livingOnly) {
|
|
|
|
for(Entity ent : world.getEntities()) {
|
|
|
|
if(ent instanceof EntityLiving)
|
|
|
|
list.add(ent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
list.addAll(world.getEntities());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(list.isEmpty())
|
2025-03-25 23:10:40 +01:00
|
|
|
throw new RunException(this.livingOnly ? "Keine lebendigen Objekte gefunden" : "Keine Objekte gefunden");
|
2025-03-25 17:02:41 +01:00
|
|
|
return list;
|
|
|
|
}
|
|
|
|
else if(input.equals("*")) {
|
|
|
|
List<Entity> list = Lists.newArrayList();
|
|
|
|
for(NetHandlerPlayServer plr : env.getServer().getPlayers()) {
|
|
|
|
if(plr.getEntity() != null)
|
|
|
|
list.add(plr.getEntity());
|
|
|
|
}
|
|
|
|
if(list.isEmpty())
|
2025-03-25 23:10:40 +01:00
|
|
|
throw new RunException("Keine Spieler gefunden");
|
2025-03-25 17:02:41 +01:00
|
|
|
return list;
|
|
|
|
}
|
2025-03-25 23:10:40 +01:00
|
|
|
Set<Entity> set = Sets.newHashSet();
|
|
|
|
for(String tok : input.split(",", -1)) {
|
|
|
|
Class<? extends Entity> clazz = EntityRegistry.getEntityClass(tok);
|
|
|
|
if(clazz != null) {
|
|
|
|
if(this.livingOnly && !EntityLiving.class.isAssignableFrom(clazz))
|
|
|
|
throw new RunException("Objekttyp %s ist nicht lebendig", EntityRegistry.getEntityName(EntityRegistry.getEntityString(clazz)));
|
|
|
|
for(WorldServer world : env.getServer().getWorlds()) {
|
|
|
|
for(Entity ent : world.getEntities()) {
|
|
|
|
if(clazz.isAssignableFrom(ent.getClass()))
|
|
|
|
set.add(ent);
|
|
|
|
}
|
2025-03-25 17:02:41 +01:00
|
|
|
}
|
|
|
|
}
|
2025-03-25 23:10:40 +01:00
|
|
|
else {
|
|
|
|
set.add((Entity)super.parse(env, tok));
|
|
|
|
}
|
2025-03-25 17:02:41 +01:00
|
|
|
}
|
2025-03-25 23:10:40 +01:00
|
|
|
if(set.isEmpty())
|
|
|
|
throw new RunException("Keine Objekte gefunden");
|
|
|
|
return Lists.newArrayList(set);
|
2025-03-25 17:02:41 +01:00
|
|
|
}
|
|
|
|
|
2025-03-25 23:10:40 +01:00
|
|
|
public Object getDefault(CommandEnvironment env) {
|
2025-03-25 17:02:41 +01:00
|
|
|
Entity entity = (Entity)super.getDefault(env);
|
|
|
|
return entity == null ? null : Lists.newArrayList(entity);
|
|
|
|
}
|
|
|
|
|
2025-03-25 23:10:40 +01:00
|
|
|
public String[] getCompletions(CommandEnvironment env) {
|
2025-03-25 17:02:41 +01:00
|
|
|
Entity target = env.getExecutor().getPointedEntity();
|
|
|
|
List<String> comp = target == null || (this.livingOnly && !(target instanceof EntityLiving)) ? Lists.newArrayList() : Lists.newArrayList("#" + target.getId());
|
|
|
|
comp.addAll(env.getServer().getAllUsernames());
|
|
|
|
comp.add("*");
|
|
|
|
for(Class<? extends Entity> clazz : EntityRegistry.getAllClasses()) {
|
|
|
|
if(!this.livingOnly || EntityLiving.class.isAssignableFrom(clazz))
|
|
|
|
comp.add(EntityRegistry.getEntityString(clazz));
|
|
|
|
}
|
|
|
|
comp.add("**");
|
|
|
|
return comp.toArray(new String[comp.size()]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Class<?> getTypeClass() {
|
|
|
|
return List.class;
|
|
|
|
}
|
|
|
|
}
|