public function execute(CommandSender $sender, $currentAlias, array $args)
{
if (!$this->testPermission($sender)) {
return true;
}
if (count($args) != 1 and count($args) != 4 and count($args) != 5) {
$sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage]));
return true;
}
$x = 0;
$y = 0;
$z = 0;
if (count($args) == 4 or count($args) == 5) {
//position is set
//TODO:simpilify them to one piece of code
//Code for setting $x
if (is_numeric($args[1])) {
//x is given directly
$x = $args[1];
} elseif (strcmp($args[1], "~") >= 0) {
//x is given with a "~"
$offset_x = trim($args[1], "~");
if ($sender instanceof Player) {
//using in-game
$x = is_numeric($offset_x) ? $sender->x + $offset_x : $sender->x;
} else {
//using in console
$sender->sendMessage(TextFormat::RED . "You must specify a position where the entity is spawned to when using in console");
return false;
}
} else {
//other circumstances
$sender->sendMessage(TextFormat::RED . "Argument error");
return false;
}
//Code for setting $y
if (is_numeric($args[2])) {
//y is given directly
$y = $args[2];
} elseif (strcmp($args[2], "~") >= 0) {
//y is given with a "~"
$offset_y = trim($args[2], "~");
if ($sender instanceof Player) {
//using in-game
$y = is_numeric($offset_y) ? $sender->y + $offset_y : $sender->y;
$y = min(128, max(0, $y));
} else {
//using in console
$sender->sendMessage(TextFormat::RED . "You must specify a position where the entity is spawned to when using in console");
return false;
}
} else {
//other circumstances
$sender->sendMessage(TextFormat::RED . "Argument error");
return false;
}
//Code for setting $z
if (is_numeric($args[3])) {
//z is given directly
$z = $args[3];
} elseif (strcmp($args[3], "~") >= 0) {
//z is given with a "~"
$offset_z = trim($args[3], "~");
if ($sender instanceof Player) {
//using in-game
$z = is_numeric($offset_z) ? $sender->z + $offset_z : $sender->z;
} else {
//using in console
$sender->sendMessage(TextFormat::RED . "You must specify a position where the entity is spawned to when using in console");
return false;
}
} else {
//other circumstances
$sender->sendMessage(TextFormat::RED . "Argument error");
return false;
}
}
//finish setting the location
if (count($args) == 1) {
if ($sender instanceof Player) {
$x = $sender->x;
$y = $sender->y;
$z = $sender->z;
} else {
$sender->sendMessage(TextFormat::RED . "You must specify a position where the entity is spawned to when using in console");
return false;
}
}
//finish setting the location
$entity = null;
$type = $args[0];
$level = $sender instanceof Player ? $sender->getLevel() : $sender->getServer()->getDefaultLevel();
$chunk = $level->getChunk(round($x) >> 4, round($z) >> 4);
$nbt = new CompoundTag("", ["Pos" => new ListTag("Pos", [new DoubleTag("", $x), new DoubleTag("", $y), new DoubleTag("", $z)]), "Motion" => new ListTag("Motion", [new DoubleTag("", 0), new DoubleTag("", 0), new DoubleTag("", 0)]), "Rotation" => new ListTag("Rotation", [new FloatTag("", lcg_value() * 360), new FloatTag("", 0)])]);
if (count($args) == 5 and $args[4][0] == "{") {
//Tags are found
$nbtExtra = NBT::parseJSON($args[4]);
$nbt = NBT::combineCompoundTags($nbt, $nbtExtra, true);
}
$entity = Entity::createEntity($type, $chunk, $nbt);
if ($entity instanceof Entity) {
$entity->spawnToAll();
$sender->sendMessage("Successfully spawned entity {$type} at ({$x}, {$y}, {$z})");
return true;
} else {
$sender->sendMessage(TextFormat::RED . "An error occurred when spawning the entity {$type}");
return false;
}
}