Code: 2.10 14:31:45 [Server] Server thread/CRITICAL Could not pass event 'pocketmine\event\player\PlayerItemHeldEvent' to 'Perks v0.3': Call to undefined method perks\PerksMain::sendEffects() on perks\PerksMain 12.10 14:31:42 [Multicraft] Skipped 18 lines due to rate limit (30/s) 12.10 14:31:39 [Server] Server thread/DEBUG #3 src/pocketmine/plugin/PluginManager(721): pocketmine\plugin\RegisteredListener->callEvent(pocketmine\event\player\PlayerItemHeldEvent object) 12.10 14:31:39 [Server] Server thread/DEBUG #2 src/pocketmine/plugin/RegisteredListener(98): pocketmine\plugin\MethodEventExecutor->execute(perks\PerksMain object, pocketmine\event\player\PlayerItemHeldEvent object) 12.10 14:31:39 [Server] Server thread/DEBUG #1 src/pocketmine/plugin/MethodEventExecutor(38): perks\PerksMain->onHold(pocketmine\event\player\PlayerItemHeldEvent object) 12.10 14:31:39 [Server] Server thread/DEBUG #0 Perks/src/perks/PerksMain(73): perks\PerksMain->giveItemEffect(pocketmine\Player object, pocketmine\item\Item object) 12.10 14:31:39 [Server] Server thread/CRITICAL Error: "Call to undefined method perks\PerksMain::sendEffects()" (EXCEPTION) in "Perks/src/perks/PerksMain" at line 93 12.10 14:31:39 [Server] Server thread/CRITICAL Could not pass event 'pocketmine\event\player\PlayerItemHeldEvent' to 'Perks v0.3': Call to undefined method perks\PerksMain::sendEffects() on perks\PerksMain I have this Item Effect Plugin. But everytime I use the itemheldevent it gives me this HUGE thing in console and makes the cpu go up by like 15. Can Someone tell me how I can make a super simple Item Effects plugin? Just using itemheldevent.
PHP: <?phpnamespace Perks;use pocketmine\entity\Effect;use pocketmine\event\entity\EntityArmorChangeEvent;use pocketmine\event\Listener;use pocketmine\event\player\PlayerInteractEvent;use pocketmine\event\player\PlayerItemHeldEvent;use pocketmine\event\player\PlayerRespawnEvent;use pocketmine\item\Item;use pocketmine\Player;use pocketmine\plugin\PluginBase;use pocketmine\utils\Config;class Perks extends PluginBase implements Listener{ private $cooldown = []; private $last = []; private $fac; public function onEnable() { @mkdir($this->getDataFolder()); $this->c = new Config($this->getDataFolder()."config.yml",Config::YAML,[ "tap-effect-time" => 5, "items" => [ "353:0" =>[ "held" => [ "1:2" ]); $this->getServer()->getPluginManager()->registerEvents($this,$this); $this->fac = $this->getServer()->getPluginManager()->getPlugin("FactionsPro"); if ($this->fac == null) $this->getLogger()->critical("NO FACTIONSPRO PLUGIN DETECTED!"); } public function getData($type){ $all = $this->c->getAll(); return $all[$type]; } /* * Events * Section */ public function onHold(PlayerItemHeldEvent $ev){ $p = $ev->getPlayer(); $i = $ev->getItem(); if (isset($this->last[$p->getName()])){ if ($this->last[$p->getName()] != $i->getId().":".$i->getDamage()){ $old = explode(":",$this->last[$p->getName()]); $old = Item::get($old[0],$old[1]);// if ($this->isEffectItem($old)) $this->removeOldItemEffect($p,$old); if ($this->isEffectItem($old)) $this->sendTempEffect($p,$old); } } if ($this->isEffectItem($i)) $this->giveItemEffect($p,$i); $this->last[$p->getName()] = $i->getId().":".$i->getDamage(); } public function onWear(EntityArmorChangeEvent $ev){ $ent = $ev->getEntity(); if ($ent instanceof Player){ if ($ev->getNewItem()->getId() != 0){ if ($this->checkArmor($ent,$ev->getNewItem())) $this->addArmorEffects($ent); }else{ $this->removeArmorEffects($ent); } } } public function onTap(PlayerInteractEvent $ev){ $i = $ev->getItem(); $p = $ev->getPlayer(); if ($this->isEffectItem($i)){ if ($this->checkCoolDown($p,$i)){ $this->giveTapEffect($p,$i); $this->addToCoolDown($p,$i); } } } public function onSpawn(PlayerRespawnEvent $ev){ if ($this->checkArmor($ev->getPlayer(),Item::get(0))) { $this->addArmorEffects($ev->getPlayer()); }else{ $this->removeArmorEffects($ev->getPlayer()); } } /* * Actual * API */ public function checkArmor(Player $player,Item $new) : bool { $inv = $player->getInventory(); $helmet = $inv->getHelmet()->getId(); $chestplate = $inv->getChestplate()->getId(); $legging = $inv->getLeggings()->getId(); $boots = $inv->getBoots()->getId(); return (($helmet == Item::GOLD_HELMET || $new->getId() == Item::GOLD_HELMET) && ($chestplate == Item::GOLD_CHESTPLATE || $new->getId() == Item::GOLD_CHESTPLATE) && ($legging == Item::GOLD_LEGGINGS || $new->getId() == Item::GOLD_LEGGINGS) && ($boots == Item::GOLD_BOOTS || $new->getId() == Item::GOLD_BOOTS)); } public function addArmorEffects(Player $p){ $effects = $this->getData("armor-effects"); foreach ($effects as $effect){ $e = explode(":",$effect); $p->addEffect(Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(9999999)); } } public function removeArmorEffects(Player $p){ $effects = $this->getData("armor-effects"); foreach ($effects as $effect){ $e = explode(":",$effect); if ($p->hasEffect($e[0])) $p->removeEffect($e[0]); } } public function addToCoolDown(Player $player, Item $item){ $this->cooldown[$player->getName()][$item->getId()] = time() + $this->getData("cooldown"); } public function checkCoolDown(Player $player, Item $item) : bool { if (isset($this->cooldown[$player->getName()][$item->getId()])){ if ($this->cooldown[$player->getName()][$item->getId()] <= time()) return true; }else{ return true; } return false; } public function giveTapEffect(Player $p, Item $i){ $all = $this->c->getAll(); $effects = $all["items"][$i->getId().":".$i->getDamage()]["tap"]; foreach ($effects as $effect){ $e = explode(":",$effect); if ($p->hasEffect($e[0])) $p->removeEffect($e[0]); $p->addEffect(Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration($this->getData("tap-effect-time") * 20)); $this->sendEffects($p,Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration($this->getData("tap-effect-time") * 20)); } $this->getServer()->getScheduler()->scheduleDelayedTask(new OldEffectTask($this,$p,$i),($this->getData("tap-effect-time") * 20) +5); } public function giveItemEffect(Player $p,Item $i){ $all = $this->c->getAll(); $effects = $all["items"][$i->getId().":".$i->getDamage()]["held"]; foreach ($effects as $effect){ $e = explode(":",$effect); $p->addEffect(Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(40*10)); $this->sendEffects($p,Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(40*10)); } } public function sendTempEffect(Player $p,Item $i){ $all = $this->c->getAll(); $effects = $all["items"][$i->getId().":".$i->getDamage()]["held"]; foreach ($effects as $effect){ $e = explode(":",$effect); $p->addEffect(Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(20*10)); $this->sendEffects($p,Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(20*10)); } } public function removeOldItemEffect(Player $p, Item $i){ $all = $this->c->getAll(); $effects = $all["items"][$i->getId().":".$i->getDamage()]["held"]; foreach ($effects as $effect){ $e = explode(":",$effect); if ($p->hasEffect($e[0])) $p->addEffect(Effect::getEffect($e[0])->setAmplifier($e[1] - 1)); $this->removeEffects($p,$e[0]); } } public function isEffectItem(Item $i) : bool { $all = $this->c->getAll(); return isset($all["items"][$i->getId().":".$i->getDamage()]); }}
The attemp I just showed works 100% but It makes the server lag a shit ton. That one has InteractEvenr but I want to create one with just HeldEvent
Read the error message... You are trying to call a function sendEffects() which doesn't exist in the class: PHP: $this->sendEffects($p,Effect::getEffect($e[0])->setAmplifier($e[1] - 1)->setDuration(20*10));
There is probably like 5 errors. Or even more. The plugin works how its supposed to but its messy i just want to know if there is an easier way to make a Item Effect Plugin.