Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public function shot(PlayerInteractEvent $event) : void {
- if($player->getInventory()->getItemInHand()->getId() == 388){
- $this->spawnParticles($event->getPlayer());
- $this->calculateDamage($event->getPlayer());
- }
- }
- public function calculateDamage($player) : void {
- $delta = $player->getDirectionVector() * 20;
- $from = new Vector3($player->x, $player->y + $player->getEyeHeight(), $player->z);
- $to = new Vector3($player->x + $delta, $player->y + $player->getEyeHeight() + $delta, $player->z + $delta);
- foreach ($player->getLevel()->getPlayer() as $p) {
- // Если расстояние между игроками больше 60 блоков - не проверяем
- if ($player->distance($p) > 30) continue;
- // Прямая задана двумя точками, считаем расстояние от прямой до каждого игрока
- // https://ru.wikipedia.org/wiki/Расстояние_от_точки_до_прямой_на_плоскости
- // Чтобы не мучиться с каноническими уравнениями и решениями СЛАУ
- // Подсчитаем расстояние от игрока до лазера в двух плоскостях Oxy, и Oxz
- $Oxy = abs(($to->y - $from->y) * $p->x) - ($to->x - $from->x) * $p->y + $to->x * $from->y - $to->y * $from->x)) /
- sqrt(pow($to->y - $from->y, 2) + pow($to->x - $from->x, 2));
- if ($Oxy < 2) continue;
- $Oxz = abs(($to->z - $from->z) * $p->x) - ($to->x - $from->x) * $p->z + $to->x * $from->z - $to->z * $from->x)) /
- sqrt(pow($to->z - $from->z, 2) + pow($to->x - $from->x, 2));
- if ($Oxz < 2) continue;
- $p->sendMessage("По вам попали!!!");
- }
- }
- public function spawnParticles(Player $player) : void {
- // Create redstone particle
- if (class_exists('\pocketmine\network\mcpe\protocol\LevelEventPacket', false)) {
- $pk = new \pocketmine\network\mcpe\protocol\LevelEventPacket;
- $pk->evid = \pocketmine\network\mcpe\protocol\LevelEventPacket::EVENT_ADD_PARTICLE_MASK | 7;
- }else {
- $pk = new \pocketmine\network\protocol\LevelEventPacket;
- $pk->evid = \pocketmine\network\protocol\LevelEventPacket::EVENT_ADD_PARTICLE_MASK | 7;
- }
- $pk->data = 2; // lifetime
- $particles = array();
- $addParticle = function ($x, $y, $z, $pk) {
- $particle = clone $pk;
- $particle->x = $x;
- $particle->y = $y;
- $particle->z = $z;
- $particle->encode();
- return $particle;
- };
- $direction = $player->getDirectionVector();
- $pos = new Vector3($player->x, $player->y + $player->getEyeHeight(), $player->z);
- for ($i = 0; $i < 20; $i++) {
- $pos->add($direction->x, $direction->y, $direction->z);
- $particles[] = $addParticle($pos->x, $pos->y, $pos->z, $pk);
- }
- $player->getLevel()->addChunkPacket($player->x >> 4, $player->z >> 4, $this->batchPackets($particles ));
- }
- private function batchPackets($packets) {
- if (class_exists('pocketmine\network\mcpe\protocol\BatchPacket', false))
- $pk = new \pocketmine\network\mcpe\protocol\BatchPacket;
- else $pk = new \pocketmine\network\protocol\BatchPacket;
- foreach ($packets as $packet)
- $pk->payload .= \pocketmine\utils\Binary::writeUnsignedVarInt(strlen($packet->buffer)) . $packet->buffer;
- $pk->payload = zlib_encode($pk->payload, ZLIB_ENCODING_DEFLATE, 1);
- $pk->encode();
- return $pk;
- }
Advertisement