PageRenderTime 52ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/Fishing/src/DeBePlugins/Fishing/Fishing.php

https://gitlab.com/Skull3x/Plugins
PHP | 367 lines | 361 code | 5 blank | 1 comment | 53 complexity | e977d17fd3fc887fcc7994fd8d8570f7 MD5 | raw file
  1. <?php
  2. // This Plugin is Made by DeBe (hu6677@naver.com)
  3. namespace DeBePlugins\Fishing;
  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\player\PlayerInteractEvent;
  12. use pocketmine\item\Item;
  13. use pocketmine\math\Vector3;
  14. class Fishing extends PluginBase implements Listener{
  15. public function onEnable(){
  16. $this->fish = [];
  17. $this->cool = [];
  18. $this->getServer()->getPluginManager()->registerEvents($this, $this);
  19. $this->loadYml();
  20. }
  21. public function onCommand(CommandSender $sender, Command $cmd, $label, array $sub){
  22. if(!isset($sub[0])) return false;
  23. $set = $this->set->getAll();
  24. $fish = $this->fish->getAll();
  25. $rm = TextFormat::RED . "Usage: /Fishing ";
  26. $mm = "[Fishing]";
  27. switch(strtolower($sub[0])){
  28. case "fishing":
  29. case "fs":
  30. case "on":
  31. case "off":
  32. case "낚시":
  33. case "온":
  34. case "오프":
  35. if($set["Fishing"] == "On"){
  36. $set["Fishing"] = "Off";
  37. $r = ($this->isKorean() ? "낚시를 끕니다.": "Fising is Off";
  38. }else{
  39. $set["Fishing"] = "On";
  40. $r = ($this->isKorean() ? "낚시를 켭니다.": "Fising is On";
  41. }
  42. break;
  43. case "item":
  44. case "i":
  45. case "아이템":
  46. case "템":
  47. case "낚시대":
  48. if(!isset($sub[1])){
  49. $r = ($this->isKorean() ? $rm . "아이템 <아이템ID>": $rm . "Item(I) <ItemID>";
  50. }else{
  51. $i = Item::fromString($sub[1]);
  52. $i = $i->getID() . ":" . $i->getDamage();
  53. $set["Item"] = $i;
  54. $r = ($this->isKorean() ? "낚시 아이템을 [$i] 로 설정했습니다.": "Fishing Item is set [$i]";
  55. }
  56. break;
  57. case "useitem":
  58. case "ui":
  59. case "u":
  60. case "소모아이템":
  61. case "소모템":
  62. if(!isset($sub[1])){
  63. $r = ($this->isKorean() ? $rm . "소모템 <아이템ID> <갯수>": $rm . "UseItem(U) <ItemID> <Amount>";
  64. }else{
  65. $i = Item::fromString($sub[1]);
  66. $i = $i->getID() . ":" . $i->getDamage();
  67. $cnt = 1;
  68. if(isset($sub[2]) && is_numeric($sub[2])) $cnt = $sub[2];
  69. $set["UseItem"] = ["ID" => $i,"Count" => $cnt ];
  70. $r = ($this->isKorean() ? "낚시 소모템을 [$i] (Count: $cnt) 로 설정했습니다.": "Fishing UseItem is set [$i] (Count: $cnt)";
  71. }
  72. break;
  73. case "allitem":
  74. case "ai":
  75. case "a":
  76. case "모든아이템":
  77. case "모든템":
  78. case "전체아이템":
  79. case "전체템":
  80. if(!isset($sub[1])){
  81. $r = ($this->isKorean() ? $rm . "모든템 <아이템ID> <갯수>": $rm . "AllItem(A) <ItemID> <Amount>";
  82. }else{
  83. $i = Item::fromString($sub[1]);
  84. $i = $i->getID() . ":" . $i->getDamage();
  85. $cnt = 1;
  86. if(isset($sub[2]) && is_numeric($sub[2])) $cnt = $sub[2];
  87. $set["Item"] = $i;
  88. $set["UseItem"] = ["ID" => $i,"Count" => $cnt ];
  89. $r = ($this->isKorean() ? "낚시 관련 모든템을 [$i] (Count: $cnt) 로 설정했습니다.": "Fishing AllItem is set [$i] (Count: $cnt)";
  90. }
  91. break;
  92. case "delay":
  93. case "d":
  94. case "time":
  95. case "t":
  96. case "딜레이":
  97. case "시간":
  98. case "타임":
  99. if(!isset($sub[1])){
  100. $r = ($this->isKorean() ? $rm . "딜레이 <시간>": $rm . "Delay(D) <Num>";
  101. }else{
  102. if($sub[1] < 0 || !is_numeric($sub[1])) $sub[1] = 0;
  103. if(isset($sub[2]) && $sub[2] > $sub[1] && is_numeric($sub[2]) !== false) $sub[1] = $sub[1] . "~" . $sub[2];
  104. $set["Delay"] = $sub[1];
  105. $r = ($this->isKorean() ? "낚시 딜레이를 [$sub[1]] 로 설정했습니다.": "Fishing Delay is set [$sub[1]]";
  106. }
  107. break;
  108. case "cool":
  109. case "cooltime":
  110. case "ct":
  111. case "쿨타임":
  112. case "쿨":
  113. if(!isset($sub[1])){
  114. $r = ($this->isKorean() ? $rm . "쿨타임 <시간>": $rm . "CoolTime(CT) <Num>";
  115. }else{
  116. if(!isset($sub[1]) || $sub[1] < 0 || !is_numeric($sub[1])) $sub[1] = 0;
  117. $set["Cool"] = $sub[1];
  118. $r = ($this->isKorean() ? "낚시 쿨타임을 [$sub[1]] 로 설정했습니다.": "Fishing CoolTime is set [$sub[1]]";
  119. }
  120. break;
  121. case "count":
  122. case "c":
  123. case "횟수":
  124. case "갯수":
  125. if(!isset($sub[1])){
  126. $r = ($this->isKorean() ? $rm . "횟수 <횟수>": $rm . "Count(C) <Num>";
  127. }else{
  128. if($sub[1] < 1 || !is_numeric($sub[1])) $sub[1] = 1;
  129. if(isset($sub[2]) && $sub[2] > $sub[1] && is_numeric($sub[2])) $sub[1] = $sub[1] . "~" . $sub[2];
  130. $set["Count"] = $sub[1];
  131. $r = ($this->isKorean() ? "물고기획득 횟수를 [$sub[1]] 로 설정했습니다.": "Get Fish count is set [$sub[1]]";
  132. }
  133. break;
  134. case "fishs":
  135. case "fish":
  136. case "f":
  137. case "물고기":
  138. case "피쉬":
  139. if(!isset($sub[1])){
  140. $r = ($this->isKorean() ? $rm . "물고기 <추가|삭제|리셋|목록>": $rm . "Fishs(F) <Add|Del|Reset|List>";
  141. }else{
  142. switch(strtolower($sub[1])){
  143. case "add":
  144. case "a":
  145. case "추가":
  146. if(!isset($sub[2]) || !isset($sub[3])){
  147. $r = ($this->isKorean() ? $rm . "물고기 추가 <아이템ID> <확률> <갯수1> <갯수2>": $rm . "Fishs(F) Add(A) <ItemID> <Petsent> <Count1> <Count2>";
  148. }else{
  149. $i = Item::fromString($sub[2]);
  150. if($sub[3] < 1 || !is_numeric($sub[3])) $sub[3] = 1;
  151. if(!isset($sub[4]) < 0 || !is_numeric($sub[4])) $sub[4] = 0;
  152. if(isset($sub[5]) && $sub[5] > $sub[4] && is_numeric($sub[5])) $sub[4] = $sub[4] . "~" . $sub[5];
  153. $fish[] = ["Percent" => $sub[3],"ID" => $i->getID() . ":" . $i->getDamage(),"Count" => $sub[4] ];
  154. $r = ($this->isKorean() ? "물고기 추가됨 [" . $i->getID() . ":" . $i->getDamage() . " 갯수:$sub[4] 확률:$sub[3]]": "Fish add [" . $i->getID() . ":" . $i->getDamage() . " Count:$sub[4] Persent:$sub[3]]";
  155. }
  156. break;
  157. case "del":
  158. case "d":
  159. case "삭제":
  160. case "제거":
  161. if(!isset($sub[2])){
  162. $r = ($this->isKorean() ? $rm . "물고기 삭제 <번호>": $rm . "Fishs(F) Del(D) <FishNum>";
  163. }else{
  164. if($sub[2] < 0 || !is_numeric($sub[2])) $sub[2] = 0;
  165. if(!isset($fish[$sub[2] - 1])){
  166. $r = ($this->isKorean() ? "[$sub[2]] 는 존재하지않습니다. \n " . $rm . "물고기 목록 ": "[$sub[2]] does not exist.\n " . $rm . "Fish(F) List(L)";
  167. }else{
  168. $d = $fish[$sub[2] - 1];
  169. unset($fish[$sub[2] - 1]);
  170. $r = ($this->isKorean() ? "물고기 제거됨 [" . $d["ID"] . ":" . $i->getDamage() . " 갯수:" . $d["Count"] . " 확률:" . $d["Percent"] . "]": "Fish del [" . $d["ID"] . ":" . $i->getDamage() . " Count:" . $d["Count"] . " Persent:" . $d["Percent"] . "]";
  171. }
  172. }
  173. break;
  174. case "reset":
  175. case "r":
  176. case "리셋":
  177. case "초기화":
  178. $fish = [];
  179. $r = ($this->isKorean() ? "물고기 목록을 초기화합니다.": "Fish list is Reset";
  180. break;
  181. case "list":
  182. case "l":
  183. case "목록":
  184. case "리스트":
  185. $page = 1;
  186. if(isset($sub[2]) && is_numeric($sub[2])) $page = round($sub[2]);
  187. $list = ceil(count($fish) / 5);
  188. if($page >= $list) $page = $list;
  189. $r = ($this->isKorean() ? "목록 (페이지 $page/$list) \n": "List (Page $page/$list) \n";
  190. $num = 0;
  191. foreach($fish as $k){
  192. $num++;
  193. 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";
  194. }
  195. break;
  196. default:
  197. return false;
  198. break;
  199. }
  200. }
  201. break;
  202. default:
  203. return false;
  204. }
  205. if(isset($r)) $sender->sendMessage($r);
  206. $this->set->setAll($set);
  207. $this->fish->setAll($fish);
  208. $this->saveYml();
  209. return true;
  210. }
  211. public function onPlayerInteract(PlayerInteractEvent $event){
  212. if($this->set->get("Fishing") == "Off") return;
  213. $i = Item::fromString($this->set->get("Item"));
  214. $ii = $event->getItem();
  215. if($ii->getID() !== $i->getID() || $ii->getDamage() !== $i->getDamage()) return;
  216. $p = $event->getPlayer();
  217. $n = $p->getName();
  218. $m = ($this->isKorean() ? "[낚시]": "[Fishing] ";
  219. if(!isset($this->cool[$n])) $this->cool[$n] = 0;
  220. $c = microtime(true) - $this->cool[$n];
  221. if($this->cool[$n] == -1){
  222. $m .= ($this->isKorean() ? "이미 낚시를 시작했습니다. 기다려주세요.": "Already started fishing. Please wait.";
  223. }elseif($c < 0){
  224. $m .= ($this->isKorean() ? "쿨타임 :" . round($c * 100) / -100 . " 초": "Cool : " . round($c * 100) / -100 . " sec";
  225. }elseif($this->checkInven($p) !== true){
  226. $iv = $this->checkInven($p);
  227. $m .= ($this->isKorean() ? "당신은" . $iv[0] . "(." . $iv[1] . "개) 를 가지고있지않습니다. : " . $iv[2] . "개": "You Don't have " . $iv[0] . "($iv[1]) You have : " . $iv[2];
  228. }elseif($this->checkWater($event->getBlock()) !== true){
  229. $m .= ($this->isKorean() ? "이곳은 물이 아닙니다.": "Thare is not water";
  230. }else{
  231. $this->fishStart($p);
  232. unset($m);
  233. }
  234. if(isset($m)) $p->sendMessage($m);
  235. $event->setCancelled();
  236. }
  237. public function fishStart($p){
  238. $p->sendMessage($this->isKorean() ? "[낚시] 낚시를 시작했습니다. 기다려주세요.": "[Fishing] Started fishing. Please wait.");
  239. $time = $this->getTime();
  240. $this->cool[$p->getName()] = -1;
  241. for($for = 0; $for < $this->getCount(); $for++)
  242. $this->getServer()->getScheduler()->scheduleDelayedTask(new CallbackTask([$this,"fishGive" ], [$p ]), $time);
  243. }
  244. public function fishGive($p){
  245. $this->cool[$p->getName()] = microtime(true) + $this->set->get("Cool");
  246. $i = $this->getFish();
  247. $p->getInventory()->addItem($i);
  248. $p->sendMessage($this->isKorean() ? "[낚시] $i (갯수:" . $i->getCount() . ") 를 얻었습니다.": "[Fishing] You get $i (count:" . $i->getCount() . ")");
  249. }
  250. public function getCount(){
  251. $c = explode("~", $this->set->get("Count"));
  252. if(isset($c[1])){
  253. $cnt = rand($c[0], $c[1]);
  254. }else{
  255. $cnt = $c[0];
  256. }
  257. return $cnt;
  258. }
  259. public function getTime(){
  260. $t = explode("~", $this->set->get("Delay"));
  261. if(isset($t[1])){
  262. $time = rand($t[0], $t[1]);
  263. }else{
  264. $time = $t[0];
  265. }
  266. return $time * 20;
  267. }
  268. public function getFish(){
  269. $d = $this->fishs;
  270. shuffle($d);
  271. $d = array_shift($d);
  272. $i = Item::fromString($d["ID"]);
  273. $c = explode("~", $d["Count"]);
  274. $i->setCount($c[0]);
  275. if(isset($c[1])) $i->setCount(rand($c[0], $c[1]));
  276. return $i;
  277. }
  278. public function checkInven($p){
  279. $ui = $this->set->get("UseItem");
  280. $i = Item::fromString($ui["ID"]);
  281. $c = $ui["Count"];
  282. $cnt = 0;
  283. $inv = $p->getInventory();
  284. foreach($inv->getContents() as $item){
  285. if($item->equals($i, $i->getDamage())) $cnt += $item->getCount();
  286. if($cnt >= $c) break;
  287. }
  288. if($cnt < $c){
  289. return [$i,$c,$cnt ];
  290. }else{
  291. $i->setCount($c);
  292. $this->removeItem($p, $i);
  293. return true;
  294. }
  295. }
  296. public function removeItem($p, $i){
  297. if($damage !== true) $damage = $i->getDamage();
  298. $ic = $i->getCount();
  299. $inv = $p->getInventory();
  300. foreach($inv->getContents() as $k => $ii){
  301. if($ii->equals($i, $damage)){
  302. if($ic - $ii->getCount() > 0){
  303. $inv->clear($k);
  304. $ic -= $ii->getCount();
  305. }else{
  306. $inv->setItem($k, Item::get($i->getID(), $i->getDamage(), $ii->getCount() - $ic));
  307. return true;
  308. }
  309. }
  310. }
  311. return false;
  312. }
  313. public function checkWater($b){
  314. $gx = $b->getX();
  315. $gy = $b->getY();
  316. $gz = $b->getZ();
  317. for($x = $gx - 3; $x <= $gx + 3; $x++){
  318. for($y = $gy - 3; $y <= $gy + 3; $y++){
  319. for($z = $gz - 3; $z <= $gz + 3; $z++){
  320. $id = $b->getLevel()->getBlock(new Vector3($x, $y, $z))->getID();
  321. if($id == 8 || $id == 9) return true;
  322. }
  323. }
  324. }
  325. return false;
  326. }
  327. public function loadYml(){
  328. $path = $this->getServer()->getDataPath() . "/plugins/! DeBePlugins/Fishing/";
  329. @mkdir($path);
  330. $this->set = new Config($path . "Setting.yml", Config::YAML, ["Item" => "280:0","UseItem" => ["ID" => "265:0","Count" => 1 ],"Fishing" => "On","Delay" => "3~5","Count" => "1~2" ]);
  331. if(is_file($path . "Fishs.yml") == true){
  332. $fish = [];
  333. }else{
  334. $fish = [["Percent" => 700,"ID" => "4:0","Count" => "1" ],["Percent" => 70,"ID" => "263","Count" => "1~3" ],["Percent" => 50,"ID" => "15:0","Count" => "1" ],["Percent" => 20,"ID" => "331:0","Count" => "1~7" ],["Percent" => 15,"ID" => "14:0","Count" => "1" ],["Percent" => 5,"ID" => "351:4","Count" => "1~7" ],["Percent" => 3,"ID" => "388:0","Count" => "1" ],["Percent" => 1,"ID" => "264:0","Count" => "1" ] ];
  335. }
  336. $this->fish = new Config($path . "Fishs.yml", Config::YAML, $fish);
  337. $this->fishs = [];
  338. foreach($this->fish->getAll() as $fish){
  339. for($for = 0; $for < $fish["Percent"]; $for++)
  340. $this->fishs[] = $fish;
  341. }
  342. }
  343. public function saveYml(){
  344. $this->set->save();
  345. $this->fish->save();
  346. $this->loadYml();
  347. }
  348. public function isKorean(){
  349. return (new Config($this->getServer()->getDataPath() . "/plugins/! DeBePlugins/" . "! Korean.yml", Config::YAML, ["Korean" => false ]))->get("Korean");
  350. }
  351. }