1. The forums will be archived and moved to a read only mode in about 2 weeks (mid march).

Item Effects

Discussion in 'Development' started by Vaxrp, Oct 12, 2017.

  1. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    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.
     
  2. jasonwynn10

    jasonwynn10 Moderator Poggit Reviewer

    Messages:
    1,489
    GitHub:
    jasonwynn10
    Please show proof of a previous attempt
     
  3. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    PHP:
    <?php

    namespace 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->= 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 $playerItem $item){
            
    $this->cooldown[$player->getName()][$item->getId()] = time() + $this->getData("cooldown");
        }

        public function 
    checkCoolDown(Player $playerItem $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 $pItem $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 $pItem $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()]);

        }

     
  4. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    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
     
  5. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
  6. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    @jasonwynn10
     
  7. Teamblocket

    Teamblocket Zombie

    Messages:
    301
    GitHub:
    teamblocket
    nice error, hopefully you know how to fix it?
     
  8. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
  9. Teamblocket

    Teamblocket Zombie

    Messages:
    301
    GitHub:
    teamblocket
    >_>
     
  10. Awzaw

    Awzaw Zombie Pigman Poggit Admin

    Messages:
    726
    GitHub:
    awzaw
    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));
     
    jasonwynn10 likes this.
  11. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    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.
     
  12. jasonwynn10

    jasonwynn10 Moderator Poggit Reviewer

    Messages:
    1,489
    GitHub:
    jasonwynn10
    Yes
     
  13. Vaxrp

    Vaxrp Witch

    Messages:
    73
    GitHub:
    Vaxrp
    Can you show me an example? Using the handle event only.
     
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.