Last active
March 13, 2019 23:51
-
-
Save BEcraft/d963b5e9dc4364de6a45637c584d90e5 to your computer and use it in GitHub Desktop.
Reduce a the player's attack damage according to a clicks limit / Reduce el daño de ataque de un jugador de acuerto a un límite de clics.
This file contains 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 | |
declare(strict_types = 1); | |
/** | |
* @name Clicks | |
* @author BEcraft | |
* @main BEcraft\Clicks\Loader | |
* @api 3.0.0 | |
* @version 1.0.0 | |
*/ | |
namespace BEcraft\Clicks; | |
use pocketmine\Player; | |
use pocketmine\plugin\PluginBase; | |
use pocketmine\event\Listener; | |
use pocketmine\event\player\PlayerQuitEvent; | |
use pocketmine\event\player\PlayerJoinEvent; | |
use pocketmine\event\entity\EntityDamageEvent; | |
use pocketmine\event\server\DataPacketReceiveEvent; | |
use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; | |
class Loader extends PluginBase implements Listener { | |
/** | |
* Almacenamiento para las secciones. | |
* @var array | |
*/ | |
public static $SESSION = array(); | |
/** | |
* Cantidad máxima de clics. | |
* @var int | |
*/ | |
public static $ALLOWED = 10; | |
/** | |
* Porcentaje que hará falta para comenzar a hacer efecto. | |
* @var int | |
*/ | |
public static $PERCENT = 50; | |
public function onEnable(): void { | |
$this->getServer()->getPluginManager()->registerEvents($this, $this); | |
} | |
/** | |
* Iniciar la sección. | |
*/ | |
public function joinToGame(PlayerJoinEvent $event): void { | |
self::$SESSION[($player = $event->getPlayer())->getName()] = new ClicksHandler($player); | |
} | |
/** | |
* Remover la sección creada. | |
*/ | |
public function leaveFromGame(PlayerQuitEvent $event): void { | |
unset(self::$SESSION[$event->getPlayer()->getName()]); | |
} | |
/** | |
* Aumenta los clics del usuario. | |
*/ | |
public function handleClicks(DataPacketReceiveEvent $event): void { | |
if (!(($packet = $event->getPacket()) instanceof InventoryTransactionPacket) or ($packet->transactionType !== $packet::TYPE_USE_ITEM_ON_ENTITY and $packet->transactionType !== $packet::TYPE_USE_ITEM)) { //No solo en acción. | |
return; | |
} | |
self::$SESSION[$event->getPlayer()->getName()]->handleClick(1); | |
} | |
/** | |
* @priority HIGHEST | |
* @ignoreCancelled false | |
*/ | |
public function handleDamage(EntityDamageEvent $event): void { | |
if (($attacker = ($event->getDamager() ?? null)) instanceof Player) { | |
if ($event->getFinalDamage() === 0) { | |
return; | |
} | |
$clicks = self::$SESSION[$attacker->getName()]->handleClick(); | |
if ($clicks > self::$ALLOWED) { | |
$clicks = self::$ALLOWED; | |
} | |
$percentage = ($clicks / self::$ALLOWED) * 100; | |
if ($percentage < self::$PERCENT) { | |
return; //Aún no es suficiente. | |
} | |
$event->setBaseDamage($event->getBaseDamage() - ($event->getBaseDamage() * $percentage / 100)); | |
$attacker->sendTip("Tu nivel de daño se ha reducido un {$percentage} porciento, {$clicks}C/s."); | |
} | |
} | |
} | |
class ClicksHandler { | |
/** @var Player */ | |
private $player; | |
/** @var int */ | |
private $clicksCount = 0; | |
/** @var int */ | |
private $currentTime = 0; | |
public function __construct(Player $player) { | |
$this->player = $player; | |
} | |
public function handleClick(int $clicks = 0): int { | |
$this->clicksCount += $clicks; | |
if (($time = time()) !== $this->currentTime) { | |
$current = $this->clicksCount; | |
if (($time - $this->currentTime) >= 2) { | |
$current = 0; | |
} | |
$this->clicksCount = 0; | |
$this->currentTime = time(); | |
} | |
return ($current ?? $this->clicksCount); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment