Skip to content

Instantly share code, notes, and snippets.

@BEcraft
Last active March 13, 2019 23:51
Show Gist options
  • Save BEcraft/d963b5e9dc4364de6a45637c584d90e5 to your computer and use it in GitHub Desktop.
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.
<?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