LoginSignup
2
0

More than 1 year has passed since last update.

明治のCMを再現する

Last updated at Posted at 2021-12-12

テレビに「 Meltykiss(メルティーキッス)」という商品を宣伝するCMがあるのですが、

その中に「降る雪が~全部~メルティーキッスなら~いいのにね」という台詞があります。

それを再現しよう!!って感じのやつです。

環境

PocketMine-MP 4.0.0

再現する

いい感じに再現していきます。

どうやって再現するか

ItemEntityを使用してメルティーキッスっぽいアイテムを降らすのが一番良い感じじゃねってことでItemEntityを使って再現しようと思います。

実装する

ItemEntityを使うのでまあ重いです。

class MeltyKiss extends PluginBase{

    public function onEnable() : void{
        $this->getScheduler()->scheduleRepeatingTask(new MeltyTask(), 10);
    }
}
class MeltyTask extends Task{

    public function onRun() : void{
        foreach(Server::getInstance()->getOnlinePlayers() as $player){
            $pos = $player->getPosition();
            $pos->y = (int) $pos->y + 10;
            $bb = new AxisAlignedBB((int)$pos->x - 3, (int)$pos->y + 10, (int)$pos->z - 3, (int)$pos->x + 3, (int)$pos->y + 10, (int)$pos->z + 3);
            for($x = $bb->minX; $x <= $bb->maxX; $x++){
                for($z = $bb->minZ; $z <= $bb->maxZ; $z++){
                    $pos->x = $x;
                    $pos->z = $z;
                    $location = new Location($pos->x, $pos->y, $pos->z, $player->getWorld(), 0,0);
                    $entity = new ItemEntity($location, new Item(new ItemIdentifier(ItemIds::NETHER_BRICK_BLOCK, 0)));
                    $entity->getItem()->setCustomName("Melty Kiss");
                    $entity->spawnToAll();
                    $entity->setDespawnDelay(20 * 1.5);
                }
            }
        }
    }
}

AxisAlignedBBを利用してプレイヤーの周りにネザーレンガブロック(メルティーキッス)を落としてます。
Playerが多いとその分ItemEntityを落とす数が多くなるので鯖に20人とかいると終わります。
所詮ネタなので仕方なし。

一応これで動くには動くのですが、降ってきたメルティーキッスがインベントリを圧迫します。邪魔。
なので、MeltyKiss.phpの

public function onEnable(){
    $this->getScheduler()->scheduleRepeatingTask(new MeltyTask(), 10);
}

$this->getServer()->getPluginManager()->registerEvents($this, $this);

を追加し、新たなメソッドとして

public function e(EntityItemPickupEvent $event){
    $entity = $event->getOrigin();
    $player = $event->getEntity();
    if($entity instanceof ItemEntity and $player instanceof Player){
        if($entity->getItem()->getCustomName() === "Melty Kiss"){
            $item = $event->getItem();
            $player->getInventory()->remove($item);
        }
    }
}

を追加します。これでインベントリ内にたまってくことはなくなるはずです。

メルティーキッスに当たったときのダメージ

誰得だよって感じの動画ですね。(笑)
まあそれほど痛くなさそうなので、ダメージは少なくします。
それでも大量に降ってきたら余裕に死にますが。
とりあえず、

if($entity->getItem()->getCustomName() === "Melty Kiss")

の中に

$player->heal(new EntityRegainHealthEvent($player, -1, EntityRegainHealthEvent::CAUSE_CUSTOM));

を追加して1ダメージ食らうようにしてみました。

最後に

冬ということでメルティーキッスを再現しました。それ以上でもそれ以下でもありません。
せっかくなら参加してみようということでAdvent Calendarに参加してみました
ほんとにしょうもない記事で申し訳ないです。ちなみに私はメルティーキッスを食べたことがありません。
ていうかチョコ嫌いです。
もっと軽くする方法はあります、たぶん。ただネタなのであまり深くまではいきません。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0