PageRenderTime 30ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/Plugins/MineBlock/src/DeBePlugins/MineBlock/MineBlock.php

https://gitlab.com/Skull3x/MineBlock
PHP | 275 lines | 106 code | 14 blank | 155 comment | 13 complexity | d4e5c72eded35ef8bd3e82935dda60c5 MD5 | raw file
  1. <?php
  2. // This Plugin is Made by DeBe (hu6677@naver.com)
  3. namespace DeBePlugins\MineBlock;
  4. use pocketmine\plugin\PluginBase;
  5. use pocketmine\command\Command;
  6. use pocketmine\command\CommandSender;
  7. use pocketmine\event\Listener;
  8. use pocketmine\utils\Config;
  9. use pocketmine\utils\TextFormat;
  10. use pocketmine\scheduler\CallbackTask;
  11. use pocketmine\event\entity\ItemSpawnEvent;
  12. use pocketmine\event\block\BlockBreakEvent;
  13. use pocketmine\item\Item;
  14. use pocketmine\block\Block;
  15. class MineBlock extends PluginBase implements Listener{
  16. public function onEnable(){
  17. $this->item = [];
  18. $this->block = [];
  19. $this->getServer()->getPluginManager()->registerEvents($this, $this);
  20. $this->loadYml();
  21. }
  22. public function onCommand(CommandSender $sender, Command $cmd, $label, array $sub){
  23. if(!isset($sub[0])) return false;
  24. /* $set = $this->set->getAll();
  25. $drop = $this->mb->getAll();
  26. $rm = TextFormat::RED . "Usage: /MineBlock ";
  27. $mm = "[MineBlock] MineBlock ";
  28. switch(strtolower($sub[0])){
  29. case "mine":
  30. case "m":
  31. case "on":
  32. case "off":
  33. case "마인":
  34. case "마인블럭":
  35. case "광물블럭":
  36. case "온":
  37. case "오프":
  38. if($set["Mine"] == "On"){
  39. $set["Mine"] = "Off";
  40. $r = ($this->isKorean() ? "마인블럭을 끕니다."? "MineBlock is Off");
  41. }else{
  42. $set["Mine"] = "On";
  43. $r = ($this->isKorean() ? "마인블럭을 켭니다."? "MineBlock is On");
  44. }
  45. break;
  46. case "regen":
  47. case "r":
  48. case "리젠":
  49. case "소생":
  50. if($set["Regen"] == "On"){
  51. $set["Regen"] = "Off";
  52. $r = ($this->isKorean() ? "블럭리젠을 끕니다."? "Regen is Off";
  53. }else{
  54. $set["Regen"] = "On";
  55. $r = ($this->isKorean() ? "블럭리젠을 켭니다."? "Regen is On";
  56. }
  57. break;
  58. case "block":
  59. case "b":
  60. case "블럭":
  61. case "광물":
  62. if(!isset($sub[1])){
  63. $r = ($this->isKorean() ? $rm . "블럭 <블럭ID>": $rm . "Block(B) <BlockID>";
  64. }else{
  65. $i = Item::fromString($sub[1]);
  66. $i = $i->getID() . ":" . $i->getDamage();
  67. $set["Block"] = $i;
  68. $r = ($this->isKorean() ? "블럭을 [$i] 로 설정했습니다."? "Block is set [$i]";
  69. }
  70. break;
  71. case "delay":
  72. case "d":
  73. case "time":
  74. case "t":
  75. case "딜레이":
  76. case "시간":
  77. case "타임":
  78. if(!isset($sub[1])){
  79. $r = ($this->isKorean() ? $rm . "딜레이 <시간>": $rm . "Delay(D) <Num>";
  80. }else{
  81. if($sub[1] < 0 || !is_numeric($sub[1])) $sub[1] = 0;
  82. if(isset($sub[2]) && $sub[2] > $sub[1] && is_numeric($sub[2]) !== false) $sub[1] = $sub[1] . "~" . $sub[2];
  83. $set["Time"] = $sub[1];
  84. $r = ($this->isKorean() ? "블럭리젠 딜레이를 [$sub[1]] 로 설정했습니다."? "Block Regen Delay is set [$sub[1]]";
  85. }
  86. break;
  87. case "count":
  88. case "c":
  89. case "갯수":
  90. case "횟수":
  91. if(!isset($sub[1])){
  92. $r = ($this->isKorean() ? $rm . "횟수 <횟수>": $rm . "Count(C) <Num>";
  93. }else{
  94. if($sub[1] < 1 || !is_numeric($sub[1])) $sub[1] = 1;
  95. if(isset($sub[2]) && $sub[2] > $sub[1] && is_numeric($sub[2]) !== false) $sub[1] = $sub[1] . "~" . $sub[2];
  96. $set["Count"] = $sub[1];
  97. $r = ($this->isKorean() ? "드랍 횟수를 [$sub[1]] 로 설정했습니다."? "Drop count is set [$sub[1]]";
  98. }
  99. break;
  100. case "drop":
  101. case "drops":
  102. case "dr":
  103. case "드롭":
  104. case "드롭템":
  105. case "드랍":
  106. case "드랍템":
  107. if(!isset($sub[1])){
  108. $r = ($this->isKorean() ? $rm . "드롭 <추가|삭제|리셋|목록>": $rm . "Drops(Dr) <Add|Del|Reset|List>";
  109. }else{
  110. switch(strtolower($sub[1])){
  111. case "add":
  112. case "a":
  113. case "추가":
  114. if(!isset($sub[2]) || !isset($sub[3])){
  115. $r = ($this->isKorean() ? $rm . "드롭템 추가 <아이템ID> <확률> <갯수1> <갯수2>": $rm . "Fishs(F) Add(A) <ItemID> <Petsent> <Count1> <Count2>";
  116. }else{
  117. $i = Item::fromString($sub[2]);
  118. if($sub[3] < 1 || !is_numeric($sub[3])) $sub[3] = 1;
  119. if(!isset($sub[4]) < 0 || !is_numeric($sub[4])) $sub[4] = 0;
  120. if(isset($sub[5]) && $sub[5] > $sub[4] && is_numeric($sub[5])) $sub[4] = $sub[4] . "~" . $sub[5];
  121. $drop[] = [$sub[3], $i->getID() . ":" . $i->getDamage(), $sub[4] ];
  122. $r = ($this->isKorean() ? "드롭템 추가됨 [" . $i->getID() . ":" . $i->getDamage() . " 갯수:$sub[4] 확률:$sub[3]]"? "Drops add [" . $i->getID() . ":" . $i->getDamage() . " Count:$sub[4] Persent:$sub[3]]";
  123. }
  124. break;
  125. case "del":
  126. case "d":
  127. case "삭제":
  128. case "제거":
  129. if(!isset($sub[2])){
  130. $r = ($this->isKorean() ? $rm . "드롭템 삭제 <번호>": $rm . "Fishs(F) Del(D) <FishNum>";
  131. }else{
  132. if($sub[2] < 0 || !is_numeric($sub[2])) $sub[2] = 0;
  133. if(!isset($drop[$sub[2] - 1])){
  134. $r = ($this->isKorean() ? "[$sub[2]] 는 존재하지않습니다. \n " . $rm . "드롭템 목록 "? "[$sub[2]] does not exist.\n " . $rm . "Drops(Dr) List(L)";
  135. }else{
  136. $d = $drop[$sub[2] - 1];
  137. unset($drop[$sub[2] - 1]);
  138. $r ? "Drop del [" . $d["ID"] . " Count:" . $d["Count"] . " Persent:" . $d["Percent"] . "]";
  139. }
  140. }
  141. break;
  142. case "reset":
  143. case "r":
  144. case "리셋":
  145. case "초기화":
  146. $drop = [];
  147. $r = ($this->isKorean() ? "드롭템 목록을 초기화합니다."? "Drop list is Reset";
  148. break;
  149. case "list":
  150. case "l":
  151. case "목록":
  152. case "리스트":
  153. $page = 1;
  154. if(isset($sub[2]) && is_numeric($sub[2])) $page = round($sub[2]);
  155. $list = ceil(count($drop) / 5);
  156. if($page >= $list) $page = $list;
  157. $r = ($this->isKorean() ? "목록 (페이지 $page/$list) \n"? "List (Page $page/$list) \n";
  158. $num = 0;
  159. foreach($drop as $k){
  160. $num++;
  161. if($num + 5 > $page * 5 && $num <= $page * 5) $r .= ($this->isKorean() ? " [$num] 아이디:" . $k["ID"] . " 갯수:" . $k["Count"] . " 확률:" . $k["Percent"] . " \n": " [$num] ID:" . $k["ID"] . " Count:" . $k["Count"] . " Percent:" . $k["Percent"] . " \n";
  162. }
  163. break;
  164. default:
  165. return false;
  166. break;
  167. }
  168. }
  169. break;
  170. default:
  171. return false;
  172. break;
  173. }
  174. if(isset($r)) $sender->sendMessage($r);
  175. $this->set->setAll($set);
  176. $this->mb->setAll($drop);
  177. $this->saveYml();
  178. */ return true;
  179. }
  180. public function onBlockBreak(BlockBreakEvent $event){
  181. if($event->isCancelled()) return;
  182. $b = $event->getBlock();
  183. $key = $this->getKey($b);
  184. if(!isset($this->mb[$key])) return;
  185. if(!$event->getPlayer()->hasPermission("debe.mineblock.break")) return $event->setCancelled();
  186. $mb = $this->mb[$key];
  187. $rand = $this->rand[$key];
  188. foreach($b->getDrops($event->getItem()) as $i)
  189. $this->item[$i[0] . ":" . $i[1] . ":" . $i[2]] = true;
  190. if($mb[0] == true) $this->getServer()->getScheduler()->scheduleDelayedTask(new CallbackTask([$this,"mineRegen" ], [clone $b]), $this->randStr($mb[1]));
  191. for($for = 0; $for < $this->randStr($mb[2]); $for++)
  192. $b->getLevel()->dropItem($b, $this->getDrop($mb,$rand));
  193. $event->setCancelled();
  194. }
  195. public function onItemSpawn(ItemSpawnEvent $event){
  196. $entity = $event->getEntity();
  197. $i = $entity->getItem();
  198. $item = $i->getID() . ":" . $i->getDamage() . ":" . $i->getCount();
  199. if(isset($this->item[$item])){
  200. unset($this->item[$item]);
  201. $entity->close();
  202. }
  203. }
  204. public function getDrop($mb,$rand){
  205. $mb = $this->mb[$key];
  206. $rand = $this->rand[$key];
  207. $r = rand(1,$rand[1]);
  208. ksort($rand[0]);
  209. foreach($rand[0] as $d => $p){
  210. if($rand < $p){
  211. $i = Item::fromString($d);
  212. $i->setCount($this->randStr($mb[d][1]));
  213. return $i;
  214. }
  215. }
  216. }
  217. public function mineRegen($b,$id){
  218. $pos = $this->getPos($b);
  219. if(isset($this->block[$pos])){
  220. $b->getLevel()->setBlock($b,$b);
  221. unset($this->block[$pos]);
  222. }
  223. }
  224. public function getKey($i){
  225. return $i->getID().":".$i->getDamage();
  226. }
  227. public function getPos($b){
  228. return $b->getX().":".$b->getY().":".$b->getZ().":".$b->getLevel()->getName();
  229. }
  230. public function randStr($str){
  231. $a = explode("~", $str);
  232. return isset($a[1]) ? rand($a[0], $a[1]) : $a[0];
  233. }
  234. public function loadYml(){
  235. $path = $this->getServer()->getDataPath() . "/plugins/! DeBePlugins/";
  236. @mkdir($path);
  237. $pathC = $path . "MineBlock.yml";
  238. $this->mineBlock = new Config($pathC, Config::YAML, is_file($pathC) == true ? [] : ["48:0" => [true, "3~5", "1~1", ["4:0" => [700,1],"263:0" => [70,"1~3"],"15:0" => [50,1],"331:0" => [20,"1~7"],"14:0" => [15,1],"351:4" => [5,"1~7"],"388:0" => [3,1],"264:0" => [1,1]]]]);
  239. $mb = $this->mineBlock->getAll();
  240. $this->mb = $mb;
  241. $max = [];
  242. $rand = [];
  243. foreach($mb as $k => $v){
  244. foreach($v[3] as $p => $d){
  245. if(!isset($max[$k])) $max[$k] = 0;
  246. if(!isset($rand[$k])) $rand[$k] = [];
  247. $rand[$k][$p] = $max[$k] + $d[0];
  248. $max[$k] += $d[0];
  249. }
  250. }
  251. $this->rand = [$rand,$max];
  252. }
  253. public function saveYml(){
  254. $this->set->save();
  255. $this->mb->save();
  256. $this->loadYml();
  257. }
  258. public function isKorean(){
  259. return (new Config($this->getServer()->getDataPath() . "/plugins/! DeBePlugins/" . "! Korean.yml", Config::YAML, ["Korean" => false ]))->get("Korean");
  260. }
  261. }