Skip to content

Instantly share code, notes, and snippets.

@DavyCraft648
Created October 25, 2025 21:35
Show Gist options
  • Select an option

  • Save DavyCraft648/ca56d2587da2b08a983cf3e648e5c0c8 to your computer and use it in GitHub Desktop.

Select an option

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
<?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