Created
October 25, 2025 21:35
-
-
Save DavyCraft648/ca56d2587da2b08a983cf3e648e5c0c8 to your computer and use it in GitHub Desktop.
A plugin to test my pm Powder Snow PR pmmp/PocketMine-MP#6857
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| use pocketmine\command\Command; | |
| use pocketmine\command\CommandSender; | |
| use pocketmine\command\PluginCommand; | |
| use pocketmine\entity\Living; | |
| use pocketmine\event\entity\EntityDamageEvent; | |
| use pocketmine\permission\DefaultPermissionNames; | |
| use pocketmine\permission\Permission; | |
| use pocketmine\permission\PermissionManager; | |
| use pocketmine\player\Player; | |
| use pocketmine\plugin\PluginBase; | |
| use pocketmine\scheduler\ClosureTask; | |
| use pocketmine\scheduler\TaskHandler; | |
| /** | |
| * @name FreezeTester | |
| * @main FreezeTester | |
| * @version 1.0.0 | |
| * @api 5.0.0 | |
| */ | |
| class FreezeTester extends PluginBase{ | |
| private ?TaskHandler $freezeTask = null; | |
| private ?TaskHandler $progressTask = null; | |
| public function onEnable() : void{ | |
| $perm = new Permission("freezetester.command"); | |
| PermissionManager::getInstance()->getPermission(DefaultPermissionNames::GROUP_USER)->addChild($perm->getName(), true); | |
| PermissionManager::getInstance()->addPermission($perm); | |
| $command = new PluginCommand("freeze", $this, $this); | |
| $command->setPermission($perm->getName()); | |
| $this->getServer()->getCommandMap()->register($this->getName(), $command); | |
| } | |
| public function onDisable() : void{ | |
| if($this->freezeTask !== null){ | |
| $this->freezeTask->cancel(); | |
| $this->freezeTask = null; | |
| } | |
| if($this->progressTask !== null){ | |
| $this->progressTask->cancel(); | |
| $this->progressTask = null; | |
| } | |
| } | |
| public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool{ | |
| if(!($sender instanceof Player)){ | |
| $sender->sendMessage("This command must be used in-game"); | |
| return true; | |
| } | |
| $player = $sender; | |
| $entity = $player; | |
| $sub = $args[0] ?? null; | |
| switch($sub){ | |
| case null: | |
| case "toggle": | |
| if($this->freezeTask !== null){ | |
| $this->freezeTask->cancel(); | |
| $this->freezeTask = null; | |
| $player->sendMessage("Freeze scheduler stopped"); | |
| }else{ | |
| $playerName = $player->getName(); | |
| $handler = $this->getScheduler()->scheduleRepeatingTask(new ClosureTask(function() use ($playerName) : void{ | |
| $p = $this->getServer()->getPlayerExact($playerName); | |
| if($p instanceof Player){ | |
| $p->setAccumulatingFreeze(true); | |
| }else{ | |
| if($this->freezeTask !== null){ | |
| $this->freezeTask->cancel(); | |
| $this->freezeTask = null; | |
| } | |
| } | |
| }), 1); | |
| $this->freezeTask = $handler; | |
| $player->sendMessage("Freeze scheduler started"); | |
| } | |
| break; | |
| case "progress": | |
| $name = $player->getName(); | |
| if($this->progressTask !== null){ | |
| $this->progressTask->cancel(); | |
| $this->progressTask = null; | |
| $player->sendMessage("Stopped action bar progress display"); | |
| break; | |
| } | |
| $handler = $this->getScheduler()->scheduleRepeatingTask(new ClosureTask(function() use ($name) : void{ | |
| $p = $this->getServer()->getPlayerExact($name); | |
| if(!($p instanceof Player)){ | |
| if($this->progressTask !== null){ | |
| $this->progressTask->cancel(); | |
| $this->progressTask = null; | |
| } | |
| return; | |
| } | |
| $ticks = $p->getFreezeProgressTicks(); | |
| $ratio = round($p->getFreezeProgressRatio() * 100, 1); | |
| $p->sendActionBarMessage("Freeze: $ticks ticks ($ratio%)"); | |
| }), 1); | |
| $this->progressTask = $handler; | |
| $player->sendMessage("Started action bar progress display"); | |
| break; | |
| case "set": | |
| $ticks = isset($args[1]) ? (int) $args[1] : null; | |
| if($ticks === null){ | |
| $player->sendMessage("Usage: /freeze set <ticks>"); | |
| break; | |
| } | |
| $entity->setFreezeProgressTicks($ticks); | |
| $player->sendMessage("Set freeze progress ticks to $ticks"); | |
| break; | |
| case "lock": | |
| $entity->lockFreezeTicks(true); | |
| $player->sendMessage("Locked freeze ticking"); | |
| break; | |
| case "unlock": | |
| $entity->lockFreezeTicks(false); | |
| $player->sendMessage("Unlocked freeze ticking"); | |
| break; | |
| case "damage": | |
| if(isset($args[1])){ | |
| if(!is_numeric($args[1])){ | |
| $player->sendMessage("Usage: /freeze damage <positive-number>"); | |
| break; | |
| } | |
| $amount = (float) $args[1]; | |
| }else{ | |
| $amount = 1.0; | |
| } | |
| if($amount <= 0){ | |
| $player->sendMessage("Usage: /freeze damage <positive-number>"); | |
| break; | |
| } | |
| $this->applyFreezeDamageTo($entity, $amount); | |
| $player->sendMessage("Applied $amount freeze damage"); | |
| break; | |
| default: | |
| $player->sendMessage("Unknown subcommand"); | |
| } | |
| return true; | |
| } | |
| private function applyFreezeDamageTo(Living $l, float $amount = 1.0) : void{ | |
| $ev = new EntityDamageEvent($l, EntityDamageEvent::CAUSE_FREEZE, $amount); | |
| $l->attack($ev); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment