public function execute(CommandSender $sender, $currentAlias, array $args) { if (!$this->testPermission($sender)) { return true; } if (count($args) < 2) { $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return true; } $player = $sender->getServer()->getPlayer($args[0]); $item = Item::fromString($args[1]); if (!isset($args[2])) { $item->setCount($item->getMaxStackSize()); } else { $item->setCount((int) $args[2]); } if (isset($args[3])) { $tags = $exception = null; $data = implode(" ", array_slice($args, 3)); try { $tags = NBT::parseJSON($data); } catch (\Throwable $ex) { $exception = $ex; } if (!$tags instanceof CompoundTag or $exception !== null) { $sender->sendMessage(new TranslationContainer("commands.give.tagError", [$exception !== null ? $exception->getMessage() : "Invalid tag conversion"])); return true; } $item->setNamedTag($tags); } if ($player instanceof Player) { if ($item->getId() === 0) { $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.give.item.notFound", [$args[1]])); return true; } //TODO: overflow $player->getInventory()->addItem(clone $item); } else { $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.player.notFound")); return true; } Command::broadcastCommandMessage($sender, new TranslationContainer("%commands.give.success", [$item->getName() . " (" . $item->getId() . ":" . $item->getDamage() . ")", (string) $item->getCount(), $player->getName()])); return true; }
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; } }