<?php __HALT_COMPILER(); ?>
q                     src/pawarenessc/slot/Main.php!  :\!  P
      
   plugin.yml   :\   H<      <?php

namespace pawarenessc\slot;

use pocketmine\utils\Config;
use pocketmine\utils\TextFormat;

use pocketmine\event\Listener;
use pocketmine\Player;

use pocketmine\scheduler\Task;

use pocketmine\plugin\PluginBase;

use pocketmine\Server;

use pocketmine\command\Command;
use pocketmine\command\CommandSender;

use pocketmine\block\Block;

use pocketmine\math\Vector3;

use pocketmine\level\sound\PopSound;
use pocketmine\level\sound\AnvilFallSound;
use pocketmine\level\sound\EndermanTeleportSound;

use pocketmine\event\server\DataPacketReceiveEvent;

use pocketmine\network\mcpe\protocol\ModalFormRequestPacket;
use pocketmine\network\mcpe\protocol\ModalFormResponsePacket;
use MixCoinSystem\MixCoinSystem;
use metowa1227\moneysystem\api\core\API;

class Main extends pluginBase implements Listener
{
	
		public function onEnable()
    	{
    		$this->getLogger()->info("=========================");
 			$this->getLogger()->info("SLOTを読み込みました");
 			$this->getLogger()->info("制作者: PawarenessC");
 			$this->getLogger()->info("ライセンス: NYSL Version 0.9982");
 			$this->getLogger()->info("http://www.kmonos.net/nysl/");
 			$this->getLogger()->info("バージョン:{$this->getDescription()->getVersion()}");
 			$this->getLogger()->info("=========================");
       
        $this->config = new Config($this->getDataFolder()."Setup.yml", Config::YAML,
			[
			
			"説明" > "プラグインは使用する経済プラグイン(EconomyAPI,MoneySystem,MixCoinSystem)から選んで記入してください、値段は一回スロットをする値段、ジャックポット以外の賞金は777以外のゾロ目が当たった時の値段を設定してください、ジャックポットは弄らない方がいいです",
			"プラグイン" => "EconomyAPI",
			"値段" => 100,
			"ジャックポット以外の賞金" => 1000,
			"初期ジャックポット" => 10000,
			"ジャックポット" => 10000,
			]);
			
				$this->system = $this->getServer()->getPluginManager()->getPlugin("EconomyAPI");

  		}
  	
  	public function onCommand(CommandSender $sender, Command $command, string $label, array $args) : bool{
		switch($label)
		{
			case "slot":
			$money = $this->getMoney($sender);
			$price = $this->config->get("値段");
			if($price > $money)
			{
				$sender->sendMessage("§b§lSLOT>> §cお金が足りません！ スロットを一回回すには§f{$price}円§c必要です");
				return true;
				break;
			}else{
			
				$this->getScheduler()->scheduleDelayedTask(new CallbackTask([$this, "slot1"], [$sender]),30);
				$sender->addTitle("§f[§e?§f]-[§e?§f]-[§e?§f]","§6抽選を開始します...");
				$this->oto($sender, "pop");
				return true;
			}
			break;
			
			
			return true;
			
			case "jackpot":
			$sender->sendMessage("§lSLOT>> §b準備中...");
			break;
	}
}
	
	public function slot1($p)
	{
		$s1 = mt_rand(0,10);
		if($s1 == 10){ $s1 = 1; }
		$p->addTitle("§f[§e{$s1}§f]-[§a?§f]-[§c?§f]");
		$this->oto($p, "pop");
		$this->getScheduler()->scheduleDelayedTask(new CallbackTask([$this, "slot2"], [$p, $s1]),30);
	}
	
	public function slot2($p,$s1)
	{
		$s2 = mt_rand(0,10);
		if($s2 == 10){ $s2 = 2; }
		$p->addTitle("§f[§e{$s1}§f]-[§a{$s2}§f]-[§c?§f]");
		$this->oto($p, "pop");
		$this->getScheduler()->scheduleDelayedTask(new CallbackTask([$this, "slot3"], [$p, $s1, $s2]),30);
	}
	
	public function slot3($p,$s1,$s2)
	{
		$s3 = mt_rand(0,10);
		if($s3 == 10){ $s3 = 3; }
		$p->addTitle("§f[§e{$s1}§f]-[§a{$s2}§f]-[§c{$s3}§f]");
		$this->oto($p, "pop");
		$this->getScheduler()->scheduleDelayedTask(new CallbackTask([$this, "end"], [$p, $s1, $s2, $s3]),20);
	}
	
	public function end($p,$s1,$s2,$s3)
	{
		$money = $this->config->get("値段");
		$this->cutMoney($p,$money);
		if($s1 == $s2 && $s1 == $s3)
		{
			switch($s1)
			{
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
				case 6:
				case 8:
				case 9:
				
				$money = $this->config->get("ジャックポット以外の賞金");
				$this->addMoney($money, $p);
				$this->oto($p, "teleport");
				
				$p->sendMessage("§b§lSLOT>> §6ゾロ目おめでとうございます！");
				$p->sendMessage("§b§lSLOT>> §6{$money}円§a手に入れた！");
				
				$this->config->set("ジャックポット", $this->config->get("ジャックポット") + $this->config->get("値段"));
				$this->config->save();
				break;
				
				case 7:
				$money = $this->config->get("ジャックポット");
				$this->addMoney($money, $p);
				$this->oto($p, "teleport");
				
				$p->sendMessage("§b§lSLOT>> §6ジャックポット§bおめでとうございます！");
				$p->sendMessage("§b§lSLOT>> §6{$money}円手に入れた！");
				
				$this->getServer()->broadcastMessage("§lSLOT>> §a{$p->getName()}さんがジャックポット {$money}円を手に入れました！");
				$this->getServer()->broadcastMessage("§lSLOT>> ジャックポットが{$this->config->get("初期ジャックポット")}に戻りました");
				
				
				$this->config->set("ジャックポット", $this->config->get("初期ジャックポット"));
				$this->config->save();
				break;
			}
		}else
		{
			$this->config->set("ジャックポット", $this->config->get("ジャックポット") + $this->config->get("値段"));
			$this->config->save();
			$p->sendMessage("§b§lSLOT>> §c残念...ハズレです...");
			$p->sendMessage("§b§lSLOT>> §c現在のジャックポット§e{$this->config->get("ジャックポット")}円");
			$this->oto($p,"fall");
			}
	}
			
  	public function addMoney($money, $p)
  	{
 		$plugin = $this->config->get("プラグイン");
		$name = $p->getName();
 		
 		if($plugin == "EconomyAPI")
 		{
 	  		$this->system->addmoney($name ,$money);
 		}
 		
 		if($plugin == "MixCoinSystem")
 		{
 	 		MixCoinSystem::getInstance()->PlusCoin($name,$money);
 		}
 		
 		if($plugin == "MoneySystem")
 		{
 			API::getInstance()->increase($p, $money);
 		}
 	}
 	
 	public function getMoney($p)
 	{
 		$plugin = $this->config->get("プラグイン");
		$name = $p->getName();
 		if($plugin == "EconomyAPI")
 		{
 	  		return $this->system->myMoney($name);
 		}
 		
 		if($plugin == "MixCoinSystem")
 		{
 			return MixCoinSystem::getInstance()->GetCoin($name);
 		}
 		
 		if($plugin == "MoneySystem")
 		{
 			return API::getInstance()->get($p);
 		}
 	}
 	
 	public function cutMoney($p, $money)
 	{
 		$plugin = $this->config->get("プラグイン");
 		$name = $p->getName();
 		if($plugin == "EconomyAPI")
 		{
 	  		$this->system->reduceMoney($name, $money);
 		}
 		
 		if($plugin == "MixCoinSystem")
 		{
 			MixCoinSystem::getInstance()->MinusCoin($name,$money);
 		}
 		
 		if($plugin == "MoneySystem")
 		{
 			API::getInstance()->reduce($p, $money);
 		}
 	}
 	
 	public function oto($player, $id)
 	{
 		switch($id)
 		{
 			case "pop": //抽選中
 			$player->getLevel()->addSound(new PopSound(new Vector3($player->x, $player->y, $player->z)));
 			break;
 			
 			case "fall": //ハズレ
 			$player->getLevel()->addSound(new AnvilFallSound(new Vector3($player->x, $player->y, $player->z)));
 			break;
 			
 			case "teleport": //あたり...
 			$player->getLevel()->addSound(new EndermanTeleportSound(new Vector3($player->x, $player->y, $player->z)));
 			break;
 		}
 	}
     
    public function createWindow(Player $player, $data, int $id)
    {
		$pk = new ModalFormRequestPacket();
		$pk->formId = $id;
		$pk->formData = json_encode($data, JSON_PRETTY_PRINT | JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE);
		$player->dataPacket($pk);
	}
	
	public function sendForm(Player $player, $title, $come, $buttons, $id)
	{
  		$pk = new ModalFormRequestPacket(); 
  		$pk->formId = $id;
  		$this->pdata[$pk->formId] = $player;
  		$data = [ 
  		'type'    => 'form', 
  		'title'   => $title, 
  		'content' => $come, 
  		'buttons' => $buttons 
  		]; 
  		$pk->formData = json_encode( $data, JSON_PRETTY_PRINT | JSON_BIGINT_AS_STRING | JSON_UNESCAPED_UNICODE );
  		$player->dataPacket($pk);
  		$this->lastFormData[$player->getName()] = $data;
  	}
}

class CallbackTask extends Task{

	public function __construct(callable $callable, array $args = []){
		$this->callable = $callable;
		$this->args = $args;
	}

	public function onRun($tick){
		call_user_func_array($this->callable, $this->args);
	}

}


name: SLOT
main: pawarenessc\slot\Main
version: 1.6
api: [4.0.0,3.0.0,3.5.0]
author: PawarenessC
load: POSTWORLD
description: play slot.
commands:
 slot:
  description: "スロットを楽しみましょう"
  usage: "/slot"
Eq~2qiC^   GBMB