Advertisement
Guest User

Untitled

a guest
Jun 11th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 6.75 KB | None | 0 0
  1. MESSAGE:
  2.   initiate:
  3.     source: CHAT_INPUT
  4.     type: START
  5.     mask: ''
  6.     actions:
  7.    # 0) Стандартный формат.
  8.     #    Ловим любой меседж игрока. Oтменяем. Перенаправляем.
  9.     - 'CANCEL_EVENT=true'
  10.     - 'MSG=player:{loc:%player_loc% radius:30} &7 %player_display%: %message%'
  11.  
  12.     # 1) Создаём 3 переменных которые будут хранить X,Y,Z игрока что отправил данный меседж.
  13.     - 'VAR_PLAYER_SET=id:loca_X  value:%Player_x%'
  14.     - 'VAR_PLAYER_SET=id:loca_Y  value:%Player_y%'
  15.     - 'VAR_PLAYER_SET=id:loca_Z  value:%Player_z%'
  16.  
  17.     # 2) Извлекаем список игроков, имеющих указаный пермишен.
  18.     #    Т.к. текст списка изначально в неподходящем для ReActions виде, и нам надо загнать каждого игрока из списка в отдельный плейсхолдер,
  19.     #    мы фильтруем его через регулярное выражение...
  20.     - 'REGEX=input:{%listPlayers_with_perm_PERMISSION%}  regex:{(§f)([\w]{3,16})([§a,\s]{0,4})}'
  21.  
  22.     # 3) В этом акте создаем 3 таких же персональных переменных с X,Y,Z, но уже не для игрока-инициатора, а для первого игрока из списка.
  23.     #    Прикол в том, что ник игрока нам изначально неизвестен.
  24.     - 'EXECUTE=activator:setLocaValues_for_1st-onlinePlayerWithPerm  player:%group:0:2%'
  25.     # 4) То же самое, только со вторым неизвестным игроком из списка.
  26.     - 'EXECUTE=activator:setLocaValues_for_2nd-onlinePlayerWithPerm  player:%group:1:2%'
  27.    
  28.     # - 'Тут можна создать ещё подобных активаторов ("резерваций"), если "список" потенциально может состоять из больше, чем двух игроков.'
  29.     #    И это наверное сильный недостаток, т.к. если недобрать - алгоритм не учтет последних игроков из списка. А если перебрать, будет
  30.     #    много лишнего мусора и действий с переменными (надо придумать как их чистить)...
  31.  
  32.     # 5) Этот активатор, прибегая к ранее созданным переменным, хранящим координаты игрока-инициатора и первого игрока из списка
  33.     #    вычисляет дистанцию между ними. Если эта дистанция окажется больше 29.99 блоков, запустится наше ключевое дополнительное действие.
  34.     - 'EXECUTE=activator:exe1'
  35.     # 6) То же самое, только дистанция со вторым игроком из списка.
  36.     - 'EXECUTE=activator:exe2'
  37.    
  38.     # - 'Тут аналогично...'
  39.     #    Если мы создали "резервацию" для учтения 3-го игрока, который потенциально может быть в списке, то
  40.     #    значит и создаем для него такой же активатор "exe3".
  41.  
  42.  
  43.  
  44. EXEC:
  45.   setLocaValues_for_1st-onlinePlayerWithPerm:
  46.     actions:
  47.    - 'VAR_PLAYER_SET=id:loca_X  value:%Player_x%'
  48.     - 'VAR_PLAYER_SET=id:loca_Y  value:%Player_y%'
  49.     - 'VAR_PLAYER_SET=id:loca_Z  value:%Player_z%'
  50.  
  51.   setLocaValues_for_2nd-onlinePlayerWithPerm:
  52.     actions:
  53.    - 'VAR_PLAYER_SET=id:loca_X  value:%Player_x%'
  54.     - 'VAR_PLAYER_SET=id:loca_Y  value:%Player_y%'
  55.     - 'VAR_PLAYER_SET=id:loca_Z  value:%Player_z%'
  56.  
  57.  
  58.  
  59.   # P.S. Tут можна было бы сократить, не создавая лишнюю переменную, если б существовал флаг вроде "COMPARE_GREATER".
  60.   exe1:
  61.     actions:                                                             # v-- Теорема Пифагора.
  62.     - 'VAR_PLAYER_SET=id:distance_betweenPlayer-%group:0:2%  value:{%CALC:sqrt((%var:%group:0:2%.loca_X%-%var:%player%.loca_X%)^2+(%var:%group:0:2%.loca_Y%-%var:%player%.loca_Y%)^2+(%var:%group:0:2%.loca_Z%-%var:%player%.loca_Z%)^2)%}'
  63.     - 'EXECUTE=activator:exe1+'
  64.   exe1+:
  65.     flags:
  66.    - 'VAR_PLAYER_GREATER=id:distance_betweenPlayer-%group:0:2%  value:29.99'
  67.     actions:
  68.    # Формат меседжа №2, который будет отправлен первому игроку из списка.
  69.     - 'MSG=player:%group:0:2% &c %player_display%: %message%'
  70.  
  71.  
  72.  
  73.   exe2: # Аналогично...
  74.     actions:                                                             # v-- Теорема Пифагора.
  75.     - 'VAR_PLAYER_SET=id:distance_betweenPlayer-%group:1:2%  value:{%CALC:sqrt((%var:%group:1:2%.loca_X%-%var:%player%.loca_X%)^2+(%var:%group:1:2%.loca_Y%-%var:%player%.loca_Y%)^2+(%var:%group:1:2%.loca_Z%-%var:%player%.loca_Z%)^2)%}'
  76.     - 'EXECUTE=activator:exe2+'
  77.   exe2+:
  78.     flags:
  79.    - 'VAR_PLAYER_GREATER=id:distance_betweenPlayer-%group:1:2%  value:29.99'
  80.     actions:
  81.    # Аналогично, только по отношению к игроку №2 из списка.
  82.     - 'MSG=player:%group:1:2% &c %player_display%: %message%'
  83.  
  84.  
  85.  
  86.  
  87.  
  88. # ЧТО МОЖНА/ЖЕЛАТЕЛЬНО БЫ УЛУЧШИТЬ:
  89. #   1. (В инициативе разработчиков) Добавить флаг COMPARE_GREATER/LOWER, что бы не создавать попусту дополнительные переменные и
  90. #      не запускать лишние акты.
  91.  
  92. #   2. Решить на каком етапе и в какую милисекунду чистить переменные, что бы их не накапливалось очень много после каждого
  93. #      меседжа игрока. Может негативно повлиять на производительность...
  94.  
  95. #   3. Решить как сделать что б когда у тебя "резервация" учтена для 15+ игроков, что б алгоритм не розворачивался до exe15+,
  96. #      если список выдаст нам к примеру только 5 игроков онлайн. (Сильно секономит ресурсы)
  97.  
  98. #   4. Вероятны несостыковки в Пифагоре, если игроки будут в разных
  99. #      мирах (надо как то со старта обозначить такие отправки как "за радиусом").
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement