public void endMovement()
    {
        var unit = UnitPlacement [selectUnitX, selectUnitY];

        if (unit != null)
        {
            GameUnit unitStat = (GameUnit)unit.GetComponent("GameUnit");

            if (targetTileX != selectUnitX || targetTileY != selectUnitY)
            {
                TileSelect tileOld = PlayMap.Grid.getTileSpec(selectUnitX, selectUnitY);

                tileOld.resetCapture();

                UnitPlacement [targetTileX, targetTileY] = UnitPlacement [selectUnitX, selectUnitY];
                UnitPlacement [selectUnitX, selectUnitY] = null;

                unitStat.x = targetTileX;
                unitStat.y = targetTileY;
            }

            unitStat.ConfirmMovement();
        }
        //Resets selection
        targetTileX = selectUnitX = selectTileX = -1;
        targetTileY = selectUnitY = selectTileY = -1;


        UnitMovementController.fullclear();
        PlayMap.LockMovement = false;
        PlayMap.UnitMenu.SetActive(false);
        PlayMap.HideAttackInfo();
    }
Example #2
0
        public virtual void Move(Direction direction)
        {
            int x = 0;
            int y = 0;

            PlayMap playMap = new PlayMap();

            switch (direction)
            {
            case Direction.Up:
                x           = Coordinates.X;
                y           = Coordinates.Y - 1;
                Coordinates = new Coordinates(x, y);
                break;

            case Direction.Down:
                x           = Coordinates.X;
                y           = Coordinates.Y + 1;
                Coordinates = new Coordinates(x, y);
                break;

            case Direction.Left:
                x           = Coordinates.X - 1;
                y           = Coordinates.Y;
                Coordinates = new Coordinates(x, y);
                break;

            case Direction.Right:
                x           = Coordinates.X + 1;
                y           = Coordinates.Y;
                Coordinates = new Coordinates(x, y);
                break;
            }
        }
Example #3
0
        void UpdateNPCPosition_Handler(Task t)
        {
            NPC     npc = (NPC)t.Args;
            PlayMap map = _server.GetPlayMap(npc.MapID);

            map.UpdateNPCPosition(npc);
        }
Example #4
0
        void UnEquipItem_Handler(Task t)
        {
            byte equipSlot = 0xFF;

            EquipItemRequest eir      = (EquipItemRequest)t.Args;
            Item             equipped = t.Client.Character.EquippedItem(eir.ItemID);

            if (equipped != null)
            {
                equipSlot = equipped.Slot;
                t.Client.Character.UnEquipItem(equipped.Slot, eir.Slot);
                AddDBQuery(equipped.UpdateDBString(), null, false);
            }

            // Send response to the client
            t.Client.SendPacket(new UnEquipItemResponse(t.Client.Character, eir.ItemID, eir.Slot, equipSlot != 0xFF));

            if (equipSlot != 0xFF)
            {
                // Tell other players about it
                SeeUnequipPacket pkt     = new SeeUnequipPacket(t.Client.Character.ID, equipSlot);
                PlayMap          map     = _server.GetPlayMap(t.Client.Character.MapID);
                Connection[]     players = map.Players;
                foreach (Connection c in players)
                {
                    if (c != t.Client)
                    {
                        c.SendPacket(pkt);
                    }
                }
            }
        }
Example #5
0
        void DoAttack_Handler(Task t)
        {
            AttackTargetRequest atr = (AttackTargetRequest)t.Args;
            PlayMap             map = _server.GetPlayMap(t.Client.Character.MapID);

            if (atr.TargetT == AttackTargetRequest.TargetType.Monster)
            {
                map.PlayerAttackMonster(t.Client, atr);
            }
        }
    // Use this for initialization
    void Start()
    {
        PlayMap   playMap = Object.FindObjectOfType <PlayMap>();
        Transform grid    = transform.GetChild(0);

        foreach (Monster monsterPrefab in MonsterR.getAllMonsters())
        {
            GameObject monsterbtn = Instantiate(MonsterButton);
            monsterbtn.name = monsterPrefab.name + " button";
            monsterbtn.transform.SetParent(grid, false);
            monsterbtn.transform.localScale          = new Vector3(1, 1, 1);
            monsterbtn.GetComponent <Image>().sprite = monsterPrefab.GetComponent <SpriteRenderer>().sprite;
            monsterbtn.GetComponent <Image>().color  = monsterPrefab.GetComponent <SpriteRenderer>().color;
            monsterbtn.GetComponent <Button>().onClick.AddListener(delegate { playMap.onMonsterBtnClick(monsterPrefab); });
            monsterbtn.transform.GetChild(0).GetComponent <Text>().text = "$" + monsterPrefab.price;
        }
    }
Example #7
0
        void EquipItem_Handler(Task t)
        {
            EquipItemRequest eir      = (EquipItemRequest)t.Args;
            Item             item     = t.Client.Character.FindItem(eir.ItemID);
            Item             equipped = t.Client.Character.EquippedItem(eir.Slot);
            bool             visible  = false;

            if (equipped != null)
            {
                t.Client.Character.UnEquipItem(eir.Slot);
                AddDBQuery(equipped.UpdateDBString(), null, false);
                visible = true;
            }

            if (item != null)
            {
                t.Client.Character.EquipItem(item, eir.Slot);
                AddDBQuery(item.UpdateDBString(), null, false);
                visible = true;
                t.Client.NotifyEquipItem();
            }

            t.Client.SendPacket(new EquipItemResponse(t.Client.Character, item, equipped, visible));

            if (visible)
            {
                // Show all nearby clients the change
                SeeEquipmentChangePacket pkt = new SeeEquipmentChangePacket(t.Client.Character.ID, item);
                PlayMap      map             = _server.GetPlayMap(t.Client.Character.MapID);
                Connection[] players         = map.Players;
                foreach (Connection c in players)
                {
                    if (c != t.Client)
                    {
                        c.SendPacket(pkt);
                    }
                }
            }
        }
Example #8
0
    public static void nextPlayer()
    {
        PlayerFaction faction = PlayMap.getFaction(player);

        if (faction != null)
        {
            faction.SleepAllUnits();
        }

        player++;
        faction = PlayMap.getFaction(player);
        if (faction == null)
        {
            player = 0;
            nextTurn();
            faction = PlayMap.getFaction(player);
        }
        if (faction != null)
        {
            faction.WakeAllUnits();
            PlayMap.Menu.Paint(faction.FactionColor);
        }
    }
    public void cancelMovement()
    {
        if (selectUnitX >= 0 && selectUnitY >= 0)
        {
            var      unit     = UnitPlacement [selectUnitX, selectUnitY];
            GameUnit unitStat = (GameUnit)unit.GetComponent("GameUnit");
            if (hasCancelTransform)
            {
                unit.transform.position = unitCancelTransform;
                hasCancelTransform      = false;
            }

            unitStat.CancelMovement();

            //Resets selection
            targetTileX = selectUnitX = selectTileX = -1;
            targetTileY = selectUnitY = selectTileY = -1;

            UnitMovementController.fullclear();
            PlayMap.LockMovement = false;
            PlayMap.UnitMenu.SetActive(false);
            PlayMap.HideAttackInfo();
        }
    }
Example #10
0
        public void RunLoop()
        {
            while (true)
            {
                try
                {
                    if (!ProcessMemory.getInstance().IsHooked || ProcessMemory.getInstance().process is null ||
                        ProcessMemory.getInstance().process.HasExited)
                    {
                        if (!ProcessMemory.getInstance().HookProcess("Among Us"))
                        {
                            Thread.Sleep(1000);
                            continue;
                        }

                        Settings.conInterface.WriteModuleTextColored("GameMemReader", Color.Lime,
                                                                     $"Connected to Among Us process ({Color.Red.ToTextColor()}{ProcessMemory.getInstance().process.Id}{Settings.conInterface.getNormalColor().ToTextColor()})");


                        var foundModule = false;

                        while (true)
                        {
                            foreach (var module in ProcessMemory.getInstance().modules)
                            {
                                if (module.Name.Equals("GameAssembly.dll", StringComparison.OrdinalIgnoreCase))
                                {
                                    GameAssemblyPtr = module.BaseAddress;
                                    if (!GameVerifier.VerifySteamHash(module.FileName))
                                    {
                                        cracked = true;
                                        Settings.conInterface.WriteModuleTextColored("GameVerifier", Color.Red,
                                                                                     $"Client verification: {Color.Red.ToTextColor()}FAIL{Settings.conInterface.getNormalColor().ToTextColor()}.");
                                    }
                                    else
                                    {
                                        cracked = false;
                                        Settings.conInterface.WriteModuleTextColored("GameVerifier", Color.Red,
                                                                                     $"Client verification: {Color.Lime.ToTextColor()}PASS{Settings.conInterface.getNormalColor().ToTextColor()}.");
                                    }

                                    using (SHA256Managed sha256 = new SHA256Managed())
                                    {
                                        using (FileStream fs = new FileStream(module.FileName, FileMode.Open,
                                                                              FileAccess.Read))
                                        {
                                            using (var bs = new BufferedStream(fs))
                                            {
                                                var           hash = sha256.ComputeHash(bs);
                                                StringBuilder GameAssemblyhashSb = new StringBuilder(2 * hash.Length);
                                                foreach (byte byt in hash)
                                                {
                                                    GameAssemblyhashSb.AppendFormat("{0:X2}", byt);
                                                }

                                                Console.WriteLine(
                                                    $"GameAssembly Hash: {GameAssemblyhashSb.ToString()}");
                                                GameHash       = GameAssemblyhashSb.ToString();
                                                CurrentOffsets = offMan.FetchForHash(GameAssemblyhashSb.ToString());
                                                if (CurrentOffsets is not null)
                                                {
                                                    Settings.conInterface.WriteModuleTextColored("GameMemReader",
                                                                                                 Color.Lime, $"Loaded offsets: {CurrentOffsets.Description}");
                                                }
                                                else
                                                {
                                                    Settings.conInterface.WriteModuleTextColored("GameMemReader",
                                                                                                 Color.Lime,
                                                                                                 $"No offsets found for: {Color.Aqua.ToTextColor()}{GameAssemblyhashSb.ToString()}{Settings.conInterface.getNormalColor().ToTextColor()}.");
                                                }
                                            }
                                        }
                                    }

                                    foundModule = true;
                                    break;
                                }
                            }

                            if (!foundModule)
                            {
                                Settings.conInterface.WriteModuleTextColored("GameMemReader", Color.Lime,
                                                                             "Still looking for modules...");
                                //Program.conInterface.WriteModuleTextColored("GameMemReader", Color.Green, "Still looking for modules..."); // TODO: This still isn't functional, we need to re-hook to reload module addresses
                                Thread.Sleep(500); // delay and try again
                                ProcessMemory.getInstance().LoadModules();
                            }
                            else
                            {
                                break; // we have found all modules
                            }
                        }

                        try
                        {
                            if (CurrentOffsets is not null)
                            {
                                prevChatBubsVersion = ProcessMemory.getInstance().Read <int>(GameAssemblyPtr,
                                                                                             CurrentOffsets.HudManagerOffset, 0x5C,
                                                                                             0, 0x28, 0xC, 0x14, 0x10);
                            }

                            // prevGameOverReason = ProcessMemory.getInstance().Read<GameOverReason>(GameAssemblyPtr, _gameOffsets.TempDataOffset, 0x5c, 4);
                        }
                        catch
                        {
                            Settings.conInterface.WriteModuleTextColored("ERROR", Color.Red,
                                                                         "Outdated version of the game.");
                        }
                    }

                    if (cracked && ProcessMemory.getInstance().IsHooked)
                    {
                        var result = Settings.conInterface.CrackDetected();
                        if (!result)
                        {
                            Environment.Exit(0);
                        }
                        else
                        {
                            cracked = false;
                        }
                        continue;
                    }

                    if (CurrentOffsets is null)
                    {
                        continue;
                    }
                    GameState state;
                    //int meetingHudState = /*meetingHud_cachePtr == 0 ? 4 : */ProcessMemory.ReadWithDefault<int>(GameAssemblyPtr, 4, 0xDA58D0, 0x5C, 0, 0x84); // 0 = Discussion, 1 = NotVoted, 2 = Voted, 3 = Results, 4 = Proceeding
                    var meetingHud = ProcessMemory.getInstance()
                                     .Read <IntPtr>(GameAssemblyPtr, CurrentOffsets.MeetingHudOffset, 0x5C, 0);
                    var meetingHud_cachePtr = meetingHud == IntPtr.Zero
                        ? 0
                        : ProcessMemory.getInstance().Read <uint>(meetingHud, 0x8);
                    var meetingHudState =
                        meetingHud_cachePtr == 0
                            ? 4
                            : ProcessMemory.getInstance().ReadWithDefault(meetingHud, 4,
                                                                          0x84); // 0 = Discussion, 1 = NotVoted, 2 = Voted, 3 = Results, 4 = Proceeding
                    var gameState =
                        ProcessMemory.getInstance().Read <int>(GameAssemblyPtr, CurrentOffsets.AmongUsClientOffset, 0x5C,
                                                               0,
                                                               0x64); // 0 = NotJoined, 1 = Joined, 2 = Started, 3 = Ended (during "defeat" or "victory" screen only)

                    switch (gameState)
                    {
                    case 0:
                        state          = GameState.MENU;
                        exileCausesEnd = false;
                        break;

                    case 1:
                    case 3:
                        state          = GameState.LOBBY;
                        exileCausesEnd = false;
                        break;

                    default:
                    {
                        if (exileCausesEnd)
                        {
                            state = GameState.LOBBY;
                        }
                        else if (meetingHudState < 4)
                        {
                            state = GameState.DISCUSSION;
                        }
                        else
                        {
                            state = GameState.TASKS;
                        }

                        break;
                    }
                    }
                    //Console.WriteLine($"Got state: {state}");


                    var allPlayersPtr =
                        ProcessMemory.getInstance()
                        .Read <IntPtr>(GameAssemblyPtr, CurrentOffsets.GameDataOffset, 0x5C, 0, 0x24);
                    var allPlayers  = ProcessMemory.getInstance().Read <IntPtr>(allPlayersPtr, 0x08);
                    var playerCount = ProcessMemory.getInstance().Read <int>(allPlayersPtr, 0x0C);

                    var playerAddrPtr = allPlayers + 0x10;

                    // check if exile causes end
                    if (oldState == GameState.DISCUSSION && state == GameState.TASKS)
                    {
                        var exiledPlayerId = ProcessMemory.getInstance().ReadWithDefault <byte>(GameAssemblyPtr, 255,
                                                                                                CurrentOffsets.MeetingHudOffset, 0x5C, 0, 0x94, 0x08);
                        int impostorCount = 0, innocentCount = 0;

                        for (var i = 0; i < playerCount; i++)
                        {
                            var pi = ProcessMemory.getInstance().Read <PlayerInfo>(playerAddrPtr, 0, 0);
                            playerAddrPtr += 4;

                            if (pi.PlayerId == exiledPlayerId)
                            {
                                PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                                {
                                    Action       = PlayerAction.Exiled,
                                    Name         = pi.GetPlayerName(),
                                    IsDead       = pi.GetIsDead(),
                                    Disconnected = pi.GetIsDisconnected(),
                                    Color        = pi.GetPlayerColor()
                                });
                            }

                            // skip invalid, dead and exiled players
                            if (pi.PlayerName == 0 || pi.PlayerId == exiledPlayerId || pi.IsDead == 1 ||
                                pi.Disconnected == 1)
                            {
                                continue;
                            }

                            if (pi.IsImpostor == 1)
                            {
                                impostorCount++;
                            }
                            else
                            {
                                innocentCount++;
                            }
                        }

                        if (impostorCount == 0 || impostorCount >= innocentCount)
                        {
                            exileCausesEnd = true;
                            state          = GameState.LOBBY;
                        }
                    }

                    if (state != oldState || shouldForceTransmitState)
                    {
                        GameStateChanged?.Invoke(this, new GameStateChangedEventArgs {
                            NewState = state
                        });
                        shouldForceTransmitState = false;
                    }

                    if (state != oldState && state == GameState.LOBBY)
                    {
                        shouldReadLobby = true; // will eventually transmit
                    }


                    if ((oldState == GameState.DISCUSSION || oldState == GameState.TASKS) &&
                        (state == GameState.LOBBY || state == GameState.MENU)) // game ended
                    {
                        int rawGameOverReason = ProcessMemory.getInstance()
                                                .Read <int>(GameAssemblyPtr, CurrentOffsets.TempDataOffset, 0x5c, 0x4);
                        GameOverReason gameOverReason = (GameOverReason)rawGameOverReason;

                        bool humansWon = rawGameOverReason <= 1 || rawGameOverReason == 5;
                        if (humansWon) // we will be reading humans data, so set all to simps
                        {
                            foreach (string playerName in CachedPlayerInfos.Keys)
                            {
                                try
                                {
                                    CachedPlayerInfos[playerName].IsImpostor = true;
                                }
                                catch (KeyNotFoundException e)
                                {
                                    Console.WriteLine($"Could not find User: \"{playerName}\" in CachedPlayerinfos");
                                }
                            }
                        }

                        var winningPlayersPtr = ProcessMemory.getInstance()
                                                .Read <IntPtr>(GameAssemblyPtr, CurrentOffsets.TempDataOffset, 0x5C, 0xC);
                        var winningPlayers     = ProcessMemory.getInstance().Read <IntPtr>(winningPlayersPtr, 0x08);
                        var winningPlayerCount = ProcessMemory.getInstance().Read <int>(winningPlayersPtr, 0x0C);

                        var winnerAddrPtr = winningPlayers + 0x10;

                        for (var i = 0; i < winningPlayerCount; i++)
                        {
                            WinningPlayerData wpi = ProcessMemory.getInstance()
                                                    .Read <WinningPlayerData>(winnerAddrPtr, 0, 0);
                            winnerAddrPtr += 4;
                            try
                            {
                                CachedPlayerInfos[wpi.GetPlayerName()].IsImpostor = wpi.IsImpostor;
                            }
                            catch (KeyNotFoundException e)
                            {
                                Console.WriteLine($"Could not find player with name \"{wpi.GetPlayerName()}\" in CachedPlayerInfos. JSON: {JsonConvert.SerializeObject(CachedPlayerInfos, Formatting.Indented)}");
                            }
                        }

                        ImmutablePlayer[] endingPlayerInfos = new ImmutablePlayer[CachedPlayerInfos.Count];
                        CachedPlayerInfos.Values.CopyTo(endingPlayerInfos, 0);

                        GameOver?.Invoke(this, new GameOverEventArgs
                        {
                            GameOverReason = gameOverReason,
                            PlayerInfos    = endingPlayerInfos
                        });
                    }

                    GameState cachedOldState = oldState;

                    oldState = state;


                    newPlayerInfos.Clear();

                    playerAddrPtr = allPlayers + 0x10;

                    for (var i = 0; i < playerCount; i++)
                    {
                        var pi = ProcessMemory.getInstance().Read <PlayerInfo>(playerAddrPtr, 0, 0);
                        playerAddrPtr += 4;
                        if (pi.PlayerName == 0)
                        {
                            continue;
                        }
                        var playerName = pi.GetPlayerName();
                        if (playerName.Length == 0)
                        {
                            continue;
                        }

                        newPlayerInfos[playerName] = pi;             // add to new playerinfos for comparison later

                        if (!oldPlayerInfos.ContainsKey(playerName)) // player wasn't here before, they just joined
                        {
                            PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                            {
                                Action       = PlayerAction.Joined,
                                Name         = playerName,
                                IsDead       = pi.GetIsDead(),
                                Disconnected = pi.GetIsDisconnected(),
                                Color        = pi.GetPlayerColor()
                            });
                        }
                        else
                        {
                            // player was here before, we have an old playerInfo to compare against
                            var oldPlayerInfo = oldPlayerInfos[playerName];
                            if (!oldPlayerInfo.GetIsDead() && pi.GetIsDead()) // player just died
                            {
                                PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                                {
                                    Action       = PlayerAction.Died,
                                    Name         = playerName,
                                    IsDead       = pi.GetIsDead(),
                                    Disconnected = pi.GetIsDisconnected(),
                                    Color        = pi.GetPlayerColor()
                                });
                            }

                            if (oldPlayerInfo.ColorId != pi.ColorId)
                            {
                                PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                                {
                                    Action       = PlayerAction.ChangedColor,
                                    Name         = playerName,
                                    IsDead       = pi.GetIsDead(),
                                    Disconnected = pi.GetIsDisconnected(),
                                    Color        = pi.GetPlayerColor()
                                });
                            }

                            if (!oldPlayerInfo.GetIsDisconnected() && pi.GetIsDisconnected())
                            {
                                PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                                {
                                    Action       = PlayerAction.Disconnected,
                                    Name         = playerName,
                                    IsDead       = pi.GetIsDead(),
                                    Disconnected = pi.GetIsDisconnected(),
                                    Color        = pi.GetPlayerColor()
                                });
                            }
                        }
                    }

                    foreach (var kvp in oldPlayerInfos)
                    {
                        var pi         = kvp.Value;
                        var playerName = kvp.Key;
                        if (!newPlayerInfos.ContainsKey(playerName)) // player was here before, isn't now, so they left
                        {
                            PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                            {
                                Action       = PlayerAction.Left,
                                Name         = playerName,
                                IsDead       = pi.GetIsDead(),
                                Disconnected = pi.GetIsDisconnected(),
                                Color        = pi.GetPlayerColor()
                            });
                        }
                    }

                    oldPlayerInfos.Clear();

                    var emitAll = false;
                    if (shouldForceUpdatePlayers)
                    {
                        shouldForceUpdatePlayers = false;
                        emitAll = true;
                    }


                    if (state != cachedOldState && (state == GameState.DISCUSSION || state == GameState.TASKS)
                        ) // game started, or at least we're still in game
                    {
                        CachedPlayerInfos.Clear();
                        foreach (var kvp in newPlayerInfos
                                 ) // do this instead of assignment so they don't point to the same object
                        {
                            var    pi         = kvp.Value;
                            string playerName = pi.GetPlayerName();
                            CachedPlayerInfos[playerName] = new ImmutablePlayer()
                            {
                                Name       = playerName,
                                IsImpostor = false
                            };
                        }
                    }

                    foreach (var kvp in newPlayerInfos
                             ) // do this instead of assignment so they don't point to the same object
                    {
                        var pi = kvp.Value;
                        oldPlayerInfos[kvp.Key] = pi;
                        if (emitAll)
                        {
                            PlayerChanged?.Invoke(this, new PlayerChangedEventArgs
                            {
                                Action       = PlayerAction.ForceUpdated,
                                Name         = kvp.Key,
                                IsDead       = pi.GetIsDead(),
                                Disconnected = pi.GetIsDisconnected(),
                                Color        = pi.GetPlayerColor()
                            });
                        }
                    }

                    var chatBubblesPtr = ProcessMemory.getInstance().Read <IntPtr>(GameAssemblyPtr,
                                                                                   CurrentOffsets.HudManagerOffset, 0x5C, 0,
                                                                                   0x28, 0xC, 0x14);

                    var poolSize = 20; // = ProcessMemory.Read<int>(GameAssemblyPtr, 0xD0B25C, 0x5C, 0, 0x28, 0xC, 0xC)

                    var numChatBubbles  = ProcessMemory.getInstance().Read <int>(chatBubblesPtr, 0xC);
                    var chatBubsVersion = ProcessMemory.getInstance().Read <int>(chatBubblesPtr, 0x10);
                    var chatBubblesAddr = ProcessMemory.getInstance().Read <IntPtr>(chatBubblesPtr, 0x8) + 0x10;
                    var chatBubblePtrs  = ProcessMemory.getInstance().ReadArray(chatBubblesAddr, numChatBubbles);

                    var newMsgs = 0;

                    if (chatBubsVersion > prevChatBubsVersion) // new message has been sent
                    {
                        if (chatBubsVersion > poolSize)        // increments are twofold (push to and pop from pool)
                        {
                            if (prevChatBubsVersion > poolSize)
                            {
                                newMsgs = (chatBubsVersion - prevChatBubsVersion) >> 1;
                            }
                            else
                            {
                                newMsgs = poolSize - prevChatBubsVersion + ((chatBubsVersion - poolSize) >> 1);
                            }
                        }
                        else // single increments
                        {
                            newMsgs = chatBubsVersion - prevChatBubsVersion;
                        }
                    }
                    else if (chatBubsVersion < prevChatBubsVersion) // reset
                    {
                        if (chatBubsVersion > poolSize)             // increments are twofold (push to and pop from pool)
                        {
                            newMsgs = poolSize + ((chatBubsVersion - poolSize) >> 1);
                        }
                        else // single increments
                        {
                            newMsgs = chatBubsVersion;
                        }
                    }

                    prevChatBubsVersion = chatBubsVersion;

                    for (var i = numChatBubbles - newMsgs; i < numChatBubbles; i++)
                    {
                        var msgText = ProcessMemory.getInstance()
                                      .ReadString(ProcessMemory.getInstance().Read <IntPtr>(chatBubblePtrs[i], 0x20, 0x28));
                        if (msgText.Length == 0)
                        {
                            continue;
                        }
                        var msgSender = ProcessMemory.getInstance()
                                        .ReadString(ProcessMemory.getInstance().Read <IntPtr>(chatBubblePtrs[i], 0x1C, 0x28));
                        var oldPlayerInfo = oldPlayerInfos[msgSender];
                        ChatMessageAdded?.Invoke(this, new ChatMessageEventArgs
                        {
                            Sender  = msgSender,
                            Message = msgText,
                            Color   = oldPlayerInfo.GetPlayerColor()
                        });
                    }

                    if (shouldReadLobby)
                    {
                        var gameCode = ProcessMemory.getInstance().ReadString(ProcessMemory.getInstance().Read <IntPtr>(
                                                                                  GameAssemblyPtr,
                                                                                  CurrentOffsets.GameStartManagerOffset, 0x5c, 0, 0x20, 0x28));
                        string[] split;
                        if (gameCode != null && gameCode.Length > 0 && (split = gameCode.Split('\n')).Length == 2)
                        {
                            PlayRegion region = (PlayRegion)((4 - (ProcessMemory.getInstance()
                                                                   .Read <int>(GameAssemblyPtr, CurrentOffsets.ServerManagerOffset, 0x5c, 0, 0x10, 0x8,
                                                                               0x8) & 0b11)) % 3); // do NOT ask

                            //Recheck for GameOptionsOffset
                            PlayMap map = (PlayMap)ProcessMemory.getInstance().Read <int>(GameAssemblyPtr, CurrentOffsets.GameOptionsOffset, 0x5c, 0x4, 0x10);

                            this.latestLobbyEventArgs = new LobbyEventArgs()
                            {
                                LobbyCode = split[1],
                                Region    = region,
                                Map       = map,
                            };
                            shouldReadLobby     = false;
                            shouldTransmitLobby = true; // since this is probably new info
                        }
                    }

                    if (shouldTransmitLobby)
                    {
                        if (this.latestLobbyEventArgs != null)
                        {
                            JoinedLobby?.Invoke(this, this.latestLobbyEventArgs);
                        }

                        shouldTransmitLobby = false;
                    }

                    Thread.Sleep(250);
                }
                catch (Exception e)
                {
                    Settings.conInterface.WriteModuleTextColored("ERROR", Color.Red, $"Message: {e.Message} stack: {e.StackTrace}");
                    Console.WriteLine(e);
                }
            }
        }
 public void OnPointerEnter(PointerEventData eventData)
 {
     PlayMap.MoveTargetCamera((int)coordinate.x, (int)coordinate.y);
     CursorHighlight.SetActive(true);
 }
    public override void clickCoordinate(int x, int y)
    {
        bool pathconfirming = false;

        if (PlayMap.LockMovement)
        {
            TileSelect tile = PlayMap.Grid.getTileSpec(x, y);
            if (tile.HighLightColorType == TileSelect.HighlightType.EnemyTargetable || tile.HighLightColorType == TileSelect.HighlightType.EnemyRTargetable)
            {
                if (selectTileX == x && selectTileY == y)
                {
                    confirmAttack();
                }
                else
                {
                    var      unit     = UnitPlacement [selectUnitX, selectUnitY];
                    GameUnit unitStat = (GameUnit)unit.GetComponent("GameUnit");
                    UnitBattleController = UnitControlBattle.CalculateBattle(unitStat, targetTileX, targetTileY, x, y);
                    PlayMap.ShowAttackInfo(x, y);
                }
            }
            else
            {
                PlayMap.HideAttackInfo();
            }
            selectTileX = x;
            selectTileY = y;
        }
        else if (UnitPlacement [x, y] != null)
        {
            //Set tile selection
            TileSelect tile = PlayMap.Grid.getTileSpec(x, y);

            if (selectUnitX >= 0 &&                                                  // there is a unit already selected
                tile.HighLightColorType == TileSelect.HighlightType.EnemyTargetable) // selecting enemy target for direct combat

//				Debug.Log("ENGAGE!");
            //Second choosing of the same tile
            {
                if (selectTileX == x && selectTileY == y && confirmPath && UnitMovementController.getRouteSize() > 0)
                {
                    confirmMovement();
                }
                else
                {
                    GameUnit unit = (GameUnit)UnitPlacement[selectUnitX, selectUnitY].GetComponent("GameUnit");
                    if (!unit.HasMoved)
                    {
                        pathconfirming = UnitMovementController.attackSelect(x, y, unit);
                    }
                }
                selectTileX = x;
                selectTileY = y;
            }
            else if (tile.HighLightColorType == TileSelect.HighlightType.EnemyRTargetable)              // selecting indirect combat
//				Debug.Log("BOMBARD!");
            {
                selectTileX = x;
                selectTileY = y;
            }
            else
            {
                selectTileX = x;
                selectTileY = y;

                if (selectUnitX == x && selectUnitY == y)                  //Same unit
                {
                    confirmMovement();
                }
                else
                {
                    // a unit was selected

                    //				Debug.Log("ATTENTION!");

                    UnitMovementController.fullclear();

                    GameUnit unit = (GameUnit)UnitPlacement[selectTileX, selectTileY].GetComponent("GameUnit");
                    if (!unit.HasMoved)
                    {
                        selectUnitX = x;
                        selectUnitY = y;
                        UnitMovementController.mapMovement(x, y, unit);
                    }
                }
            }
        }
        else
        {
            if (selectUnitX >= 0)
            {
                //Second choosing of the same tile
                if (selectTileX == x && selectTileY == y && confirmPath && UnitMovementController.getRouteSize() > 0)
                {
                    confirmMovement();
                }
                else
                {
                    //Set tile selection
                    selectTileX = x;
                    selectTileY = y;

                    GameUnit unit = (GameUnit)UnitPlacement[selectUnitX, selectUnitY].GetComponent("GameUnit");
                    if (!unit.HasMoved)
                    {
                        pathconfirming = UnitMovementController.selectPath(x, y, unit);
                    }
                    if (!pathconfirming)                      // no valid selection
                    {
                        selectUnitX = selectTileX = -1;
                        selectUnitY = selectTileY = -1;

                        UnitMovementController.fullclear();
                    }
                }
            }
            else
            {
                //Set tile selection
                selectTileX = x;
                selectTileY = y;
            }
        }


        confirmPath = pathconfirming;

        if (selectTileX >= 0)
        {
            placeSelectHighlight(x, y);
        }
        else
        {
            removeSelectHighlight();
        }
    }
Example #13
0
 public void AddPlayMap(ushort mapID)
 {
     _maps[mapID] = new PlayMap(mapID);
 }