/src/ifteam/TutorialMode/tutorialMode.php

https://gitlab.com/Skull3x/TutorialMode · PHP · 390 lines · 368 code · 18 blank · 4 comment · 62 complexity · 70296ba57e3bf44a37eb1efcc96cc8ba MD5 · raw file

  1. <?php
  2. namespace ifteam\TutorialMode;
  3. use pocketmine\plugin\PluginBase;
  4. use pocketmine\event\Listener;
  5. use pocketmine\utils\Config;
  6. use pocketmine\command\PluginCommand;
  7. use pocketmine\utils\TextFormat;
  8. use pocketmine\event\block\SignChangeEvent;
  9. use pocketmine\level\Position;
  10. use pocketmine\event\player\PlayerInteractEvent;
  11. use pocketmine\event\player\PlayerMoveEvent;
  12. use pocketmine\event\block\BlockBreakEvent;
  13. use pocketmine\Player;
  14. use pocketmine\level\Level;
  15. use pocketmine\block\SignPost;
  16. use pocketmine\event\entity\EntityDamageEvent;
  17. use pocketmine\event\entity\EntityDamageByEntityEvent;
  18. use pocketmine\command\CommandSender;
  19. use pocketmine\event\player\PlayerChatEvent;
  20. use pocketmine\math\Vector3;
  21. class TutorialMode extends PluginBase implements Listener {
  22. private static $instance = null; // 인스턴스 변수
  23. public $messages, $db; // 메시지 변수, DB변수
  24. public $m_version = 2; // 현재 메시지 버전
  25. public $continue = [ ];
  26. public function onEnable() {
  27. @mkdir ( $this->getDataFolder () ); // 플러그인 폴더생성
  28. $this->initMessage (); // 기본언어메시지 초기화
  29. // YAML 형식의 DB생성 후 불러오기
  30. $this->db = (new Config ( $this->getDataFolder () . "pluginDB.yml", Config::YAML, [ ] ))->getAll ();
  31. // 플러그인의 인스턴스 정의
  32. if (self::$instance == null)
  33. self::$instance = $this;
  34. // 서버이벤트를 받아오게끔 플러그인 리스너를 서버에 등록
  35. $this->getServer ()->getPluginManager ()->registerEvents ( $this, $this );
  36. }
  37. public function onChat(PlayerChatEvent $event) {
  38. if (isset ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] )) {
  39. $event->setCancelled ();
  40. $this->message ( $event->getPlayer (), $this->get ( "please-read-the-sign" ) );
  41. }
  42. }
  43. public function onSignPlace(SignChangeEvent $event) {
  44. if (! $event->getPlayer ()->isOp ())
  45. return;
  46. if ($event->getLine ( 0 ) != $this->get ( "tutorial" ))
  47. return;
  48. switch (strtolower ( $event->getLine ( 1 ) )) {
  49. case $this->get ( "start" ) :
  50. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-start1" ) );
  51. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-start2" ) );
  52. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-start3" ) );
  53. $this->setStartSign ( $event->getBlock () );
  54. break;
  55. case $this->get ( "skip" ) :
  56. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-skip1" ) );
  57. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-skip2" ) );
  58. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-skip3" ) );
  59. $this->setSkipSign ( $event->getBlock () );
  60. break;
  61. case $this->get ( "restart" ) :
  62. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-restart1" ) );
  63. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-restart2" ) );
  64. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-restart3" ) );
  65. $this->setRestartSign ( $event->getBlock () );
  66. break;
  67. case $this->get ( "mine" ) :
  68. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-pass1" ) );
  69. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-pass2" ) );
  70. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-pass3" ) );
  71. $this->setMine ( $event->getBlock (), $event->getPlayer ()->getPosition () );
  72. break;
  73. case $this->get ( "shop" ) :
  74. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-pass1" ) );
  75. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-pass2" ) );
  76. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-pass3" ) );
  77. $this->setShop ( $event->getBlock (), $event->getPlayer ()->getPosition () );
  78. break;
  79. case $this->get ( "notice" ) :
  80. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-pass1" ) );
  81. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-pass2" ) );
  82. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-pass3" ) );
  83. $this->setNotice ( $event->getBlock (), $event->getPlayer ()->getPosition () );
  84. break;
  85. case $this->get ( "wild" ) :
  86. $event->setLine ( 0, TextFormat::WHITE . $this->get ( "sign-tutorial-pass1" ) );
  87. $event->setLine ( 1, TextFormat::WHITE . $this->get ( "sign-tutorial-pass2" ) );
  88. $event->setLine ( 2, TextFormat::WHITE . $this->get ( "sign-tutorial-pass3" ) );
  89. $this->setWild ( $event->getBlock (), $event->getPlayer ()->getPosition () );
  90. break;
  91. default :
  92. $this->message ( $event->getPlayer (), $this->get ( "help-signset" ) );
  93. break;
  94. }
  95. }
  96. public function onTouch(PlayerInteractEvent $event) {
  97. if (! $event->getBlock () instanceof SignPost)
  98. return;
  99. if (isset ( $this->db ["sign"] [$event->getBlock ()->getLevel ()->getFolderName ()] ["{$event->getBlock()->x}.{$event->getBlock()->y}.{$event->getBlock()->z}"] )) {
  100. switch ($this->db ["sign"] [$event->getBlock ()->getLevel ()->getFolderName ()] ["{$event->getBlock()->x}.{$event->getBlock()->y}.{$event->getBlock()->z}"]) {
  101. case "startSign" :
  102. if (! isset ( $this->db ["mine"] ))
  103. return;
  104. if (! isset ( $this->db ["shop"] ))
  105. return;
  106. if (! isset ( $this->db ["notice"] ))
  107. return;
  108. if (! isset ( $this->db ["wild"] ))
  109. return;
  110. if (! isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  111. $this->continue [strtolower ( $event->getPlayer ()->getName () )] = [
  112. "mine" => false,
  113. "shop" => false,
  114. "notice" => false,
  115. "wild" => false
  116. ];
  117. $this->message ( $event->getPlayer (), $this->get ( "start-tutorial" ) );
  118. $this->message ( $event->getPlayer (), $this->get ( "please-read-the-sign" ) );
  119. foreach ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] as $stage => $check ) {
  120. if (! $check) {
  121. $data = explode ( ".", $this->db [$stage] );
  122. if (! isset ( $data [3] ))
  123. continue; // POSDATA EXCEPTION
  124. $dx = abs ( $data [0] - $event->getPlayer ()->x );
  125. $dy = abs ( $data [1] - $event->getPlayer ()->y );
  126. $dz = abs ( $data [2] - $event->getPlayer ()->z );
  127. if ($dx <= 10 and $dy <= 10 and $dz <= 10)
  128. return;
  129. $level = $this->getServer ()->getLevelByName ( $data [3] );
  130. if (! $level instanceof Level)
  131. continue; // LEVEL EXCEPTION
  132. $event->getPlayer ()->teleport ( new Position ( $data [0], $data [1], $data [2], $level ) );
  133. $this->message ( $event->getPlayer (), $this->get ( "you-need-pass-tutorial" ) );
  134. break;
  135. }
  136. }
  137. }
  138. break;
  139. case "skipSign" :
  140. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  141. $this->message ( $event->getPlayer (), $this->get ( "already-clread-all-tutorial" ) );
  142. return;
  143. } else {
  144. $this->message ( $event->getPlayer (), $this->get ( "all-tutorial-skipped" ) );
  145. $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] = true;
  146. if (isset ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] )) {
  147. unset ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] );
  148. }
  149. }
  150. break;
  151. case "restartSign" :
  152. $this->message ( $event->getPlayer (), $this->get ( "now-tutorial-restarted" ) );
  153. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  154. unset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] );
  155. }
  156. $this->continue [strtolower ( $event->getPlayer ()->getName () )] = [
  157. "mine" => false,
  158. "shop" => false,
  159. "notice" => false,
  160. "wild" => false
  161. ];
  162. break;
  163. case "mine" :
  164. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  165. $this->message ( $event->getPlayer (), $this->get ( "already-clread-all-tutorial" ) );
  166. return;
  167. }
  168. $this->message ( $event->getPlayer (), $this->get ( "mine" ) . " " . $this->get ( "tutorial-cleared" ) );
  169. $this->continue [strtolower ( $event->getPlayer ()->getName () )] ["mine"] = true;
  170. $this->tutorialClear ( $event->getPlayer () );
  171. break;
  172. case "shop" :
  173. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  174. $this->message ( $event->getPlayer (), $this->get ( "already-clread-all-tutorial" ) );
  175. return;
  176. }
  177. $this->message ( $event->getPlayer (), $this->get ( "shop" ) . " " . $this->get ( "tutorial-cleared" ) );
  178. $this->continue [strtolower ( $event->getPlayer ()->getName () )] ["shop"] = true;
  179. $this->tutorialClear ( $event->getPlayer () );
  180. break;
  181. case "notice" :
  182. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  183. $this->message ( $event->getPlayer (), $this->get ( "already-clread-all-tutorial" ) );
  184. return;
  185. }
  186. $this->message ( $event->getPlayer (), $this->get ( "notice" ) . " " . $this->get ( "tutorial-cleared" ) );
  187. $this->continue [strtolower ( $event->getPlayer ()->getName () )] ["notice"] = true;
  188. $this->tutorialClear ( $event->getPlayer () );
  189. break;
  190. case "wild" :
  191. if (isset ( $this->db ["finished"] [strtolower ( $event->getPlayer ()->getName () )] )) {
  192. $this->message ( $event->getPlayer (), $this->get ( "already-clread-all-tutorial" ) );
  193. return;
  194. }
  195. $this->message ( $event->getPlayer (), $this->get ( "wild" ) . " " . $this->get ( "tutorial-cleared" ) );
  196. $this->continue [strtolower ( $event->getPlayer ()->getName () )] ["wild"] = true;
  197. $this->tutorialClear ( $event->getPlayer () );
  198. break;
  199. }
  200. }
  201. }
  202. public function tutorialClear(Player $player) {
  203. foreach ( $this->continue [strtolower ( $player->getName () )] as $stage => $check ) {
  204. if (! $check) {
  205. if (! isset ( $this->db [$stage] ))
  206. continue; // STAGEDATA EXCEPTION
  207. $data = explode ( ".", $this->db [$stage] );
  208. if (! isset ( $data [3] ))
  209. continue; // POSDATA EXCEPTION
  210. if ($data [3] == $player->getLevel ()->getFolderName ()) {
  211. $pos = new Vector3 ( $data [0], $data [1], $data [2] );
  212. } else {
  213. $level = $this->getServer ()->getLevelByName ( $data [3] );
  214. if (! $level instanceof Level)
  215. continue; // LEVEL EXCEPTION
  216. $pos = new Position ( $data [0], $data [1], $data [2], $level );
  217. }
  218. $this->message ( $player, $this->get ( $stage ) . " " . $this->get ( "tutorial-start" ) );
  219. $player->teleport ( $pos );
  220. return;
  221. }
  222. }
  223. $this->db ["finished"] [strtolower ( $player->getName () )] = true;
  224. unset ( $this->continue [strtolower ( $player->getPlayer ()->getName () )] );
  225. $this->message ( $player, $this->get ( "all-tutorial-cleared" ) );
  226. $this->message ( $player, $this->get ( "you-can-move-free" ) );
  227. $safe = $this->getServer ()->getDefaultLevel ()->getSafeSpawn ();
  228. if ($safe instanceof Position)
  229. $player->teleport ( $safe );
  230. }
  231. public function onDamage(EntityDamageEvent $event) {
  232. if ($event instanceof EntityDamageByEntityEvent) {
  233. if ($event->getDamager () instanceof Player) {
  234. if (isset ( $this->continue [strtolower ( $event->getDamager ()->getName () )] )) {
  235. if ($event->getEntity () instanceof Player) {
  236. $event->setCancelled ();
  237. return;
  238. }
  239. }
  240. }
  241. if ($event->getEntity () instanceof Player) {
  242. if (isset ( $this->continue [strtolower ( $event->getEntity ()->getName () )] )) {
  243. $event->setCancelled ();
  244. }
  245. }
  246. }
  247. }
  248. public function onMove(PlayerMoveEvent $event) {
  249. if (isset ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] )) {
  250. foreach ( $this->continue [strtolower ( $event->getPlayer ()->getName () )] as $stage => $check ) {
  251. if (! $check) {
  252. $data = explode ( ".", $this->db [$stage] );
  253. if (! isset ( $data [3] ))
  254. continue; // POSDATA EXCEPTION
  255. $dx = abs ( $data [0] - $event->getPlayer ()->x );
  256. $dy = abs ( $data [1] - $event->getPlayer ()->y );
  257. $dz = abs ( $data [2] - $event->getPlayer ()->z );
  258. if ($dx <= 10 and $dy <= 10 and $dz <= 10)
  259. return;
  260. $level = $this->getServer ()->getLevelByName ( $data [3] );
  261. if (! $level instanceof Level)
  262. continue; // LEVEL EXCEPTION
  263. $event->getPlayer ()->teleport ( new Position ( $data [0], $data [1], $data [2], $level ) );
  264. $this->message ( $event->getPlayer (), $this->get ( "you-need-pass-tutorial" ) );
  265. break;
  266. }
  267. }
  268. }
  269. }
  270. public function setStartSign(Position $sign) {
  271. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "startSign";
  272. }
  273. public function setSkipSign(Position $sign) {
  274. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "skipSign";
  275. }
  276. public function setRestartSign(Position $sign) {
  277. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "restartSign";
  278. }
  279. public function setMine(Position $sign, Position $player) {
  280. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "mine";
  281. $this->db ["mine"] = intval ( $player->x ) . "." . intval ( $player->y ) . "." . intval ( $player->z ) . "." . $player->getLevel ()->getFolderName ();
  282. }
  283. public function setShop(Position $sign, Position $player) {
  284. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "shop";
  285. $this->db ["shop"] = intval ( $player->x ) . "." . intval ( $player->y ) . "." . intval ( $player->z ) . "." . $player->getLevel ()->getFolderName ();
  286. }
  287. public function setNotice(Position $sign, Position $player) {
  288. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "notice";
  289. $this->db ["notice"] = intval ( $player->x ) . "." . intval ( $player->y ) . "." . intval ( $player->z ) . "." . $player->getLevel ()->getFolderName ();
  290. }
  291. public function setWild(Position $sign, Position $player) {
  292. $this->db ["sign"] [$sign->getLevel ()->getFolderName ()] ["{$sign->x}.{$sign->y}.{$sign->z}"] = "wild";
  293. $this->db ["wild"] = intval ( $player->x ) . "." . intval ( $player->y ) . "." . intval ( $player->z ) . "." . $player->getLevel ()->getFolderName ();
  294. }
  295. public function onBlockBreak(BlockBreakEvent $event) {
  296. if (isset ( $this->db ["sign"] [$event->getBlock ()->getLevel ()->getFolderName ()] ["{$event->getBlock()->x}.{$event->getBlock()->y}.{$event->getBlock()->z}"] )) {
  297. if (! $event->getPlayer ()->isOp ()) {
  298. $event->setCancelled ();
  299. return;
  300. }
  301. switch ($this->db ["sign"] [$event->getBlock ()->getLevel ()->getFolderName ()] ["{$event->getBlock()->x}.{$event->getBlock()->y}.{$event->getBlock()->z}"]) {
  302. case "mine" :
  303. if (isset ( $this->db ["mine"] ))
  304. unset ( $this->db ["mine"] );
  305. break;
  306. case "shop" :
  307. if (isset ( $this->db ["shop"] ))
  308. unset ( $this->db ["shop"] );
  309. break;
  310. case "notice" :
  311. if (isset ( $this->db ["notice"] ))
  312. unset ( $this->db ["notice"] );
  313. break;
  314. case "wild" :
  315. if (isset ( $this->db ["wild"] ))
  316. unset ( $this->db ["wild"] );
  317. break;
  318. }
  319. unset ( $this->db ["sign"] [$event->getBlock ()->getLevel ()->getFolderName ()] ["{$event->getBlock()->x}.{$event->getBlock()->y}.{$event->getBlock()->z}"] );
  320. $this->message ( $event->getPlayer (), $this->get ( "sign-deleted" ) );
  321. }
  322. }
  323. public function get($var) {
  324. if (isset ( $this->messages [$this->getServer ()->getLanguage ()->getLang ()] )) {
  325. $lang = $this->getServer ()->getLanguage ()->getLang ();
  326. } else {
  327. $lang = "eng";
  328. }
  329. return $this->messages [$lang . "-" . $var];
  330. }
  331. public static function getInstance() {
  332. return static::$instance;
  333. }
  334. public function initMessage() {
  335. $this->saveResource ( "messages.yml", false );
  336. $this->messagesUpdate ( "messages.yml" );
  337. $this->messages = (new Config ( $this->getDataFolder () . "messages.yml", Config::YAML ))->getAll ();
  338. }
  339. public function messagesUpdate($targetYmlName) {
  340. $targetYml = (new Config ( $this->getDataFolder () . $targetYmlName, Config::YAML ))->getAll ();
  341. if (! isset ( $targetYml ["m_version"] )) {
  342. $this->saveResource ( $targetYmlName, true );
  343. } else if ($targetYml ["m_version"] < $this->m_version) {
  344. $this->saveResource ( $targetYmlName, true );
  345. }
  346. }
  347. public function registerCommand($name, $fallback, $permission, $description = "", $usage = "") {
  348. $commandMap = $this->getServer ()->getCommandMap ();
  349. $command = new PluginCommand ( $name, $this );
  350. $command->setDescription ( $description );
  351. $command->setPermission ( $permission );
  352. $command->setUsage ( $usage );
  353. $commandMap->register ( $fallback, $command );
  354. }
  355. public function message(CommandSender $player, $text = "", $mark = null) {
  356. if ($mark == null)
  357. $mark = $this->get ( "default-prefix" );
  358. $player->sendMessage ( TextFormat::DARK_AQUA . $mark . " " . $text );
  359. }
  360. public function alert(CommandSender $player, $text = "", $mark = null) {
  361. if ($mark == null)
  362. $mark = $this->get ( "default-prefix" );
  363. $player->sendMessage ( TextFormat::RED . $mark . " " . $text );
  364. }
  365. public function onDisable() {
  366. $save = new Config ( $this->getDataFolder () . "pluginDB.yml", Config::YAML );
  367. $save->setAll ( $this->db );
  368. $save->save ();
  369. }
  370. // ----------------------------------------------------------------------------------
  371. }
  372. ?>