EnemyLaneSelection

Недавно на fusion увидел скрипт EnemyLaneSelection. Он показывает роли врагов,иногда это полезно.Думаю вы сможете это реализовать.
 
1 код под названием listeners
Код:
import { Game, RendererSDK, LocalPlayer, Team, Vector2 } from "wrapper/Imports";
import { State, DrawPositionX, DrawPositionY, SendAlliesChat, ChatTimeOutSend, ChatTimeOutSendRepeat } from "./Menu";
var LaneSelectionFlags_t;

(function (LaneSelectionFlags_t) {
  LaneSelectionFlags_t[LaneSelectionFlags_t["SAFE_LANE"] = 1] = "SAFE_LANE";
  LaneSelectionFlags_t[LaneSelectionFlags_t["OFF_LANE"] = 2] = "OFF_LANE";
  LaneSelectionFlags_t[LaneSelectionFlags_t["MID_LANE"] = 4] = "MID_LANE";
  LaneSelectionFlags_t[LaneSelectionFlags_t["SOFT_SUPPORT"] = 8] = "SOFT_SUPPORT";
  LaneSelectionFlags_t[LaneSelectionFlags_t["HARD_SUPPORT"] = 16] = "HARD_SUPPORT";
})(LaneSelectionFlags_t || (LaneSelectionFlags_t = {}));

let roles = new Array(2).fill(new Array(5).fill(LaneSelectionFlags_t.MID_LANE));

function GetLaneName(lane_selection_flags) {
  switch (lane_selection_flags) {
    case LaneSelectionFlags_t.HARD_SUPPORT:
      return "Hard Support";

    case LaneSelectionFlags_t.MID_LANE:
      return "Mid Lane";

    case LaneSelectionFlags_t.OFF_LANE:
      return "Off Lane";

    case LaneSelectionFlags_t.SAFE_LANE:
      return "Safe Lane";

    case LaneSelectionFlags_t.SOFT_SUPPORT:
      return "Soft Support";

    default:
      return undefined;
  }
}

Events.on("SharedObjectChanged", (id, reason, uuid, obj) => {
  if (id === 2004) {
    roles[0] = obj.members.filter(member => {
      return member.team === 0;
    }).map(member => {
      return member.lane_selection_flags;
    });
    roles[1] = obj.members.filter(member => {
      return member.team === 1;
    }).map(member => {
      return member.lane_selection_flags;
    });
  }
});
ChatTimeOutSendRepeat.OnValue(x => {
  is_send_chat = 0;
});
let player_size = 125,
    team_offset = 250,
    first_offset = 140,
    is_send_chat = 0;
export function Draw() {
  if (!State.value || !Game.IsConnected) {
    return;
  }

  let is_in_game = Game.GameState >= DOTA_GameState.DOTA_GAMERULES_STATE_PRE_GAME;

  if (is_in_game) {
    return;
  }

  let enemy_team_id = LocalPlayer.Team - Team.Radiant ^ 1,
      wSize = RendererSDK.WindowSize,
      ratio = RendererSDK.GetAspectRatio();

  switch (ratio) {
    case "4x3":
      player_size = 90;
      team_offset = 230;
      break;

    case "16x9":
      if (wSize.x === 1280 && wSize.y === 720) {
        player_size = 85;
        team_offset = 160;
      }

      break;
  }

  let base_enemy_pos = new Vector2(first_offset + (player_size * 5 + team_offset) * enemy_team_id + wSize.x / 100, DrawPositionY.value);
  let _a = roles[enemy_team_id];

  let _f = (role, i) => {
    let role_str = GetLaneName(role);

    if (role_str === undefined) {
      return;
    }

    RendererSDK.Text(role_str, base_enemy_pos.Clone().AddScalarX(i * player_size + DrawPositionX.value));

    if (SendAlliesChat.value) {
      setTimeout(() => {
        if (is_send_chat < 5) {
          setTimeout(() => {
            Game.ExecuteCommand("say_team " + (i + 1) + " slot " + role_str);
            ++is_send_chat;
          }, i * 500);
        }
      }, ChatTimeOutSend.value * 1000);
    }
  };

  for (let _i = _a.length; _i--;) {
    _f(_a[_i], _i, _a);
  }
}
export function GameStarted() {
  is_send_chat = 0;
}
export function GameEnded() {
  is_send_chat = 0;
}
export function GameConnect() {
  is_send_chat = 0;
}

2 код под названием menu
import { Menu, MenuBase } from "../../abstract/Menu.Base";
const {
BaseTree,
State
} = MenuBase(Menu, "Enemy Lane Selection");
let BaseTreeChat = BaseTree.AddNode("Chat Settings"),
SendAlliesChat = BaseTreeChat.AddToggle("Send allies chat role enemy"),
ChatTimeOutSend = BaseTreeChat.AddSlider("Delay at send message chat", 6, 1, 60),
ChatTimeOutSendRepeat = BaseTreeChat.AddButton("Repeat message"),
BaseTreeDraw = BaseTree.AddNode("Draw Settings"),
DrawPositionX = BaseTreeDraw.AddSlider("Position X", 84, -900, 900),
DrawPositionY = BaseTreeDraw.AddSlider("Position Y", 84, -900, 900);
export { State, BaseTree, DrawPositionX, DrawPositionY, SendAlliesChat, ChatTimeOutSend, ChatTimeOutSendRepeat };
 
Да я знаю что ядра разные в этих читах,но вот как он там выглядит,вдруг поможет