Пример #1
0
        private async void InitializeGameDTO(GameDTO game)
        {
            _targetGame = game;

            await game.Assignments.ForEachAsync(async (assignment) => {
                AssignmentViewModel assignmentViewModel = ViewModelLocator.Resolve <AssignmentViewModel>();
                await assignmentViewModel.InitializeAsync(_targetTeamMember);
                await assignmentViewModel.InitializeAsync(assignment);

                Assignments.Add(assignmentViewModel);
            });

            Duration.Value            = game.DurationInMinutes.ToString();
            IsGameCanceled            = game.IsCanceled;
            TimeTBD                   = game.IsTimeTbd;
            LocationDetails.Value     = game.LocationDetails;
            SelectedLocation.Value    = Locations.FirstOrDefault(lDTO => lDTO.Id == game.Location.Id);
            Arrival.Value             = game.MinutesToArriveEarly.ToString();
            Notes.Value               = game.Notes;
            IsTowardStandings         = game.NotForStandings;
            SelectedOpponent.Value    = Opponents.FirstOrDefault(oDTO => oDTO.Id == game.Opponent.Id);
            Date.Value                = game.StartDate;
            Time.Value                = game.StartDate.TimeOfDay;
            SelectedActionVenue.Value = ActionVenues.FirstOrDefault(aVDI => aVDI.ActionVenue == game.Type);
            UniformDescription.Value  = game.Uniform;
        }
Пример #2
0
        public override bool OnPlayerDisconnect(Client player)
        {
            Opponent curOp = Opponents.FirstOrDefault(op => op.Client == player);

            if (curOp == null)
            {
                return(true);
            }

            if (RememberedBlips.ContainsKey(player.NetConnection.RemoteUniqueIdentifier))
            {
                RememberedBlips[player.NetConnection.RemoteUniqueIdentifier] = curOp.Blip;
            }
            else
            {
                RememberedBlips.Add(player.NetConnection.RemoteUniqueIdentifier, curOp.Blip);
            }

            if (curOp.Vehicle != 0)
            {
                Program.ServerInstance.SendNativeCallToPlayer(player, 0xAD738C3085FE7E11, curOp.Vehicle, true, false);
                Program.ServerInstance.SendNativeCallToPlayer(player, 0xAE3CBE5BF394C9C9, curOp.Vehicle);
            }

            if (curOp.Blip != 0)
            {
                Program.ServerInstance.SendNativeCallToPlayer(player, 0x45FF974EEE1C8734, curOp.Blip, 0);
            }

            lock (Opponents) Opponents.Remove(curOp);
            return(true);
        }
Пример #3
0
    public void onDisconnect(Client player, string reason)
    {
        Opponent curOp = Opponents.FirstOrDefault(op => op.Client == player);

        if (curOp == null)
        {
            return;
        }
        API.deleteEntity(curOp.Vehicle);
        lock (Opponents) Opponents.Remove(curOp);
    }
Пример #4
0
 private void onClientEvent(Client sender, string eventName, params object[] arguments)
 {
     if (eventName == "race_requestRespawn")
     {
         Opponent curOp = Opponents.FirstOrDefault(op => op.Client == sender);
         if (curOp == null || curOp.HasFinished || !curOp.HasStarted || curOp.CheckpointsPassed == 0)
         {
             return;
         }
         RespawnPlayer(sender, CurrentRace, curOp.CheckpointsPassed - 1);
     }
 }
Пример #5
0
 public void onPlayerRespawn(Client player)
 {
     if (IsRaceOngoing)
     {
         Opponent curOp = Opponents.FirstOrDefault(op => op.Client == player);
         if (curOp == null || curOp.HasFinished || !curOp.HasStarted || curOp.CheckpointsPassed == 0)
         {
             SetUpPlayerForRace(player, CurrentRace, false, 0);
         }
         else
         {
             RespawnPlayer(player, CurrentRace, curOp.CheckpointsPassed - 1);
         }
     }
 }
Пример #6
0
 public void onPlayerRespawn(Client player)
 {
     if (IsRaceStarting)
     {
         SetUpPlayerForRace(player, CurrentRace, false, 0);
     }
     else if (IsRaceOngoing)
     {
         API.setPlayerToSpectator(player);
         Opponent curOp = Opponents.FirstOrDefault(op => op.Client == player);
         if (curOp == null)
         {
             return;
         }
         curOp.IsAlive = false;
     }
 }
Пример #7
0
    public void onUpdate(object sender, EventArgs e)
    {
        if (!IsRaceOngoing)
        {
            return;
        }

        lock (Opponents)
        {
            var count = 0;
            foreach (var playa in Opponents)
            {
                if (playa.Client.Position.Z <= 0 || playa.Client.Position.Z <= CurrentRace.Checkpoints[0].Z)
                {
                    API.setPlayerHealth(playa.Client, -1);
                    playa.IsAlive = false;
                }

                if (playa.IsAlive)
                {
                    count++;
                }
            }

            if (count <= 1)
            {
                StartVote();
                var winner = Opponents.FirstOrDefault(op => op.IsAlive);
                if (winner != null)
                {
                    API.sendChatMessageToAll("The winner is ~b~" + winner.Client.Name + "~w~!");
                }
                else
                {
                    API.sendChatMessageToAll("There are no winners!");
                }

                IsRaceOngoing = false;
            }
        }
    }
Пример #8
0
    private void SetUpPlayerForRace(Client client, Race race, bool freeze, int spawnpoint)
    {
        if (race == null)
        {
            return;
        }

        var selectedModel = unchecked ((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)]));
        var position      = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Position;
        var heading       = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Heading;

        API.setEntityPosition(client.CharacterHandle, position);

        var playerVehicle = API.createVehicle(selectedModel, position, new Vector3(0, 0, heading), 0, 0);

        Thread.Sleep(500);
        API.setPlayerIntoVehicle(client, playerVehicle, -1);

        if (freeze)
        {
            API.setEntityPositionFrozen(client, playerVehicle, true);
        }

        Opponent inOp = Opponents.FirstOrDefault(op => op.Client == client);

        lock (Opponents)
        {
            if (inOp != null)
            {
                inOp.Vehicle = playerVehicle;
                inOp.IsAlive = true;
            }
            else
            {
                Opponents.Add(new Opponent(client)
                {
                    Vehicle = playerVehicle, IsAlive = true
                });
            }
        }
    }
Пример #9
0
        /*private int CalculatePlayerPositionInRace(Client player)
         * {
         *  int output = 0;
         *  int playerCheckpoint = _currentRace.Checkpoints.Length - _checkpoints.Count;
         *
         *  int beforeYou = _rivalCheckpointStatus.Count(tuple => tuple.Item2 > playerCheckpoint);
         *  output += beforeYou;
         *
         *  var samePosAsYou = _rivalCheckpointStatus.Where(tuple => tuple.Item2 == playerCheckpoint);
         *  output +=
         *      samePosAsYou.Count(
         *          tuple =>
         *              (_currentRace.Checkpoints[playerCheckpoint] - tuple.Item1.Vehicle.Position).Length() <
         *              (_currentRace.Checkpoints[playerCheckpoint] - Game.Player.Character.Position).Length());
         *
         *  return output;
         * }*/

        private void SetPlayerInVehicle(Client player, int model, Vector3 pos, float heading, bool freeze)
        {
            Program.ServerInstance.SetNativeCallOnTickForPlayer(player, "RACE_REQUEST_MODEL", 0x963D27A58DF860AC, model);
            Thread.Sleep(5000);
            Program.ServerInstance.RecallNativeCallOnTickForPlayer(player, "RACE_REQUEST_MODEL");

            Program.ServerInstance.GetNativeCallFromPlayer(player, "spawn", 0xAF35D0D2583051B0, new IntArgument(),
                                                           delegate(object o)
            {
                Program.ServerInstance.SendNativeCallToPlayer(player, 0xF75B0D629E1C063D, new LocalPlayerArgument(), (int)o, -1);
                if (freeze)
                {
                    Program.ServerInstance.SendNativeCallToPlayer(player, 0x428CA6DBD1094446, (int)o, true);
                }

                Opponent inOp = Opponents.FirstOrDefault(op => op.Client == player);

                lock (Opponents)
                {
                    if (inOp != null)
                    {
                        inOp.Vehicle    = (int)o;
                        inOp.HasStarted = true;
                    }
                    else
                    {
                        Opponents.Add(new Opponent(player)
                        {
                            Vehicle = (int)o, HasStarted = true
                        });
                    }
                }

                Program.ServerInstance.SendNativeCallToPlayer(player, 0xE532F5D78798DAAB, model);
            }, model, pos.X, pos.Y, pos.Z, heading, false, false);
        }
Пример #10
0
        private void SetUpPlayerForRace(Client client, Race race, bool freeze, int spawnpoint)
        {
            if (race == null)
            {
                return;
            }

            var selectedModel = unchecked ((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)]));
            var position      = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Position;
            var heading       = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Heading;

            Program.ServerInstance.SendNativeCallToPlayer(client, 0x06843DA7060A026B, new LocalPlayerArgument(),
                                                          position.X, position.Y, position.Z, 0, 0, 0, 1);

            if (race.Checkpoints.Length >= 2)
            {
                Vector3 dir = race.Checkpoints[1].Subtract(race.Checkpoints[0]);
                dir = dir.Normalize();

                Program.ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER_DIR",
                                                                    0x28477EC23D892089, 20, race.Checkpoints[0].Subtract(new Vector3()
                {
                    X = 0f, Y = 0f, Z = -2f
                }), dir, new Vector3()
                {
                    X = 60f, Y = 0f, Z = 0f
                },
                                                                    new Vector3()
                {
                    X = 4f, Y = 4f, Z = 4f
                }, 87, 193, 250, 200, false, false, 2, false, false,
                                                                    false, false);
            }


            Program.ServerInstance.SetNativeCallOnTickForPlayer(client, "RACE_CHECKPOINT_MARKER",
                                                                0x28477EC23D892089, 1, race.Checkpoints[0], new Vector3(), new Vector3(),
                                                                new Vector3()
            {
                X = 10f, Y = 10f, Z = 2f
            }, 241, 247, 57, 180, false, false, 2, false, false,
                                                                false, false);


            var nt = new Thread((ThreadStart) delegate
            {
                SetPlayerInVehicle(client, selectedModel, position, heading, freeze);
            });

            nt.Start();

            Opponent curOp = Opponents.FirstOrDefault(op => op.Client == client);

            if (curOp == null || curOp.Blip == 0)
            {
                Program.ServerInstance.GetNativeCallFromPlayer(client, "start_blip", 0x5A039BB0BCA604B6,
                                                               new IntArgument(), // ADD_BLIP_FOR_COORD
                                                               delegate(object o)
                {
                    lock (Opponents)
                    {
                        Opponent secOp = Opponents.FirstOrDefault(op => op.Client == client);

                        if (secOp != null)
                        {
                            secOp.Blip = (int)o;
                        }
                        else
                        {
                            Opponents.Add(new Opponent(client)
                            {
                                Blip = (int)o
                            });
                        }
                    }
                }, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z);
            }
            else
            {
                Program.ServerInstance.SendNativeCallToPlayer(client, 0x45FF974EEE1C8734, curOp.Blip, 255);
                Program.ServerInstance.SendNativeCallToPlayer(client, 0xAE2AF67E9D9AF65D, curOp.Blip, race.Checkpoints[0].X, race.Checkpoints[0].Y, race.Checkpoints[0].Z);
            }
        }
Пример #11
0
        public override bool OnChatMessage(Client sender, string message)
        {
            if (message == "/votemap" && !IsVoteActive() && (!IsRaceOngoing || DateTime.UtcNow.Subtract(RaceStart).TotalSeconds > 60))
            {
                StartVote();
                return(false);
            }
            else if (message.StartsWith("/vote"))
            {
                if (DateTime.Now.Subtract(VoteStart).TotalSeconds > 60)
                {
                    Program.ServerInstance.SendChatMessageToPlayer(sender, "No current vote is in progress.");
                    return(false);
                }

                var args = message.Split();

                if (args.Length <= 1)
                {
                    Program.ServerInstance.SendChatMessageToPlayer(sender, "USAGE", "/vote [id]");
                    return(false);
                }

                if (Voters.Contains(sender))
                {
                    Program.ServerInstance.SendChatMessageToPlayer(sender, "ERROR", "You have already voted!");
                    return(false);
                }

                int choice;
                if (!int.TryParse(args[1], out choice) || choice <= 0 || choice > AvailableChoices.Count)
                {
                    Program.ServerInstance.SendChatMessageToPlayer(sender, "USAGE", "/vote [id]");
                    return(false);
                }

                Votes[choice]++;
                Program.ServerInstance.SendChatMessageToPlayer(sender, "You have voted for " + AvailableChoices[choice].Name);
                Voters.Add(sender);
                return(false);
            }
            else if (message == "/q")
            {
                Opponent curOp = Opponents.FirstOrDefault(op => op.Client == sender);

                if (curOp != null)
                {
                    if (curOp.Blip != 0)
                    {
                        Program.ServerInstance.SendNativeCallToPlayer(sender, 0x45FF974EEE1C8734, curOp.Blip, 0);
                        //Program.ServerInstance.SendNativeCallToPlayer(sender, 0x86A652570E5F25DD, new PointerArgumentInt() {Data = curOp.Blip});
                    }

                    lock (Opponents) Opponents.Remove(curOp);
                }

                Program.ServerInstance.KickPlayer(sender, "requested");
                return(false);
            }
            return(true);
        }
Пример #12
0
        public void onUpdate()
        {
            if (DateTime.Now.Subtract(LastSecond).TotalMilliseconds > 1000)
            {
                LastSecond = DateTime.Now;
                if (TimeLeft > 0)
                {
                    TimeLeft--;

                    if (TimeLeft == 0)
                    {
                        if (!IsVoteActive())
                        {
                            StartVote();
                        }
                    }
                    else if (TimeLeft == 30)
                    {
                        API.sendChatMessageToAll("¡Vota por el próximo mapa que comenzará en 30 segundos!");
                    }
                    else if (TimeLeft == 59)
                    {
                        API.sendChatMessageToAll("¡Vota por el próximo mapa que comenzará en 60 segundos!");
                    }
                }

                if (RaceStartCountdown > 0)
                {
                    RaceStartCountdown--;

                    if (RaceStartCountdown == 3)
                    {
                        API.triggerClientEventForAll("startRaceCountdown");
                    }
                    else if (RaceStartCountdown == 0)
                    {
                        IsRaceOngoing = true;

                        lock (Opponents)
                            foreach (var opponent in Opponents)
                            {
                                API.setEntityPositionFrozen(opponent.Client, opponent.Vehicle, false);
                                opponent.HasStarted = true;
                            }

                        RaceTimer = DateTime.Now;
                    }
                }

                if (VoteEnd > 0)
                {
                    VoteEnd--;
                    if (VoteEnd == 0)
                    {
                        EndRace();
                        var raceWon = AvailableChoices[Votes.OrderByDescending(pair => pair.Value).ToList()[0].Key];
                        API.sendChatMessageToAll("La carrera ~b~" + raceWon.Name + "~w~ ha ganado en votos!");

                        API.delay(1000, true, () => {
                            StartRace(raceWon);
                        });
                    }
                }
            }

            if (!IsRaceOngoing)
            {
                return;
            }

            lock (Opponents)
            {
                var count = 0;
                foreach (var playa in Opponents)
                {
                    if (playa.Client.position.Z <= 0 || playa.Client.position.Z <= CurrentRace.Checkpoints[0].Z)
                    {
                        API.setPlayerHealth(playa.Client, -1);
                        playa.IsAlive = false;
                    }

                    if (playa.IsAlive)
                    {
                        count++;
                    }
                }

                if (count <= 1)
                {
                    StartVote();
                    var winner = Opponents.FirstOrDefault(op => op.IsAlive);
                    if (winner != null)
                    {
                        API.sendChatMessageToAll("El ganador es ~b~" + winner.Client.name + "~w~!");
                    }
                    else
                    {
                        API.sendChatMessageToAll("No hay ganadores!");
                    }

                    IsRaceOngoing = false;
                }
            }
        }
Пример #13
0
    private void RespawnPlayer(Client client, Race race, int checkpoint)
    {
        if (race == null)
        {
            return;
        }

        Opponent inOp = Opponents.FirstOrDefault(op => op.Client == client);

        int selectedModel = 0;
        int color1        = 0;
        int color2        = 0;

        if (inOp != null)
        {
            selectedModel = API.getEntityModel(inOp.Vehicle);
            color1        = API.getVehiclePrimaryColor(inOp.Vehicle);
            color2        = API.getVehicleSecondaryColor(inOp.Vehicle);
        }

        if (selectedModel == 0)
        {
            selectedModel = unchecked ((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)]));
        }


        var position = CurrentRaceCheckpoints[checkpoint];
        var next     = position;

        if (CurrentRaceCheckpoints.Count > checkpoint + 1)
        {
            next = CurrentRaceCheckpoints[checkpoint + 1];
        }
        else
        {
            next = CurrentRaceCheckpoints[checkpoint - 1];
        }

        float heading;

        var direction = next - position;

        direction.Normalize();

        var radAtan = -Math.Atan2(direction.X, direction.Y);

        heading = (float)(radAtan * 180f / Math.PI);

        API.setEntityPosition(client.handle, position);

        Vector3 newDir = null;

        if (CurrentRaceCheckpoints.Count > checkpoint + 2)
        {
            Vector3 dir = CurrentRaceCheckpoints[checkpoint + 2].Subtract(CurrentRaceCheckpoints[checkpoint + 1]);
            dir.Normalize();
            newDir = dir;
        }


        var nextPos = CurrentRaceCheckpoints[checkpoint + 1];

        if (newDir == null)
        {
            API.triggerClientEvent(client, "setNextCheckpoint", nextPos, true, false);
        }
        else
        {
            API.triggerClientEvent(client, "setNextCheckpoint", nextPos, false, false, newDir, CurrentRaceCheckpoints[checkpoint + 2]);
        }


        var playerVehicle = API.createVehicle((VehicleHash)selectedModel, position, new Vector3(0, 0, heading), color1, color2);

        API.setPlayerIntoVehicle(client, playerVehicle, -1);

        lock (Opponents)
        {
            if (inOp != null)
            {
                API.deleteEntity(inOp.Vehicle);
                inOp.Vehicle    = playerVehicle;
                inOp.HasStarted = true;
            }
            else
            {
                Opponents.Add(new Opponent(client)
                {
                    Vehicle = playerVehicle, HasStarted = true
                });
            }
        }
    }
Пример #14
0
    private void SetUpPlayerForRace(Client client, Race race, bool freeze, int spawnpoint)
    {
        if (race == null)
        {
            return;
        }

        var selectedModel = unchecked ((int)((uint)race.AvailableVehicles[randGen.Next(race.AvailableVehicles.Length)]));
        var position      = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Position;
        var heading       = race.SpawnPoints[spawnpoint % race.SpawnPoints.Length].Heading;

        API.setEntityPosition(client.handle, position);

        Vector3 newDir = null;

        if (race.Checkpoints.Length >= 2)
        {
            Vector3 dir = race.Checkpoints[1].Subtract(race.Checkpoints[0]);
            dir.Normalize();
            newDir = dir;
        }


        var nextPos = race.Checkpoints[0];

        if (newDir == null)
        {
            API.triggerClientEvent(client, "setNextCheckpoint", nextPos, true, false);
        }
        else
        {
            API.triggerClientEvent(client, "setNextCheckpoint", nextPos, false, false, newDir, race.Checkpoints[1]);
        }

        var playerVehicle = API.createVehicle((VehicleHash)selectedModel, position, new Vector3(0, 0, heading), randGen.Next(70), randGen.Next(70));

        API.setPlayerIntoVehicle(client, playerVehicle, -1);

        if (freeze)
        {
            API.setEntityPositionFrozen(client, playerVehicle, true);
        }

        Opponent inOp = Opponents.FirstOrDefault(op => op.Client == client);

        lock (Opponents)
        {
            if (inOp != null)
            {
                inOp.Vehicle    = playerVehicle;
                inOp.HasStarted = true;
            }
            else
            {
                Opponents.Add(new Opponent(client)
                {
                    Vehicle = playerVehicle, HasStarted = true
                });
            }
        }
    }
Пример #15
0
        Move BruteForceDo()
        {
            var fictive = 0;

            if (queue.Count < Team.Count())
            {
                foreach (var tr in Team)
                {
                    if (!queue.Contains(tr.Id))
                    {
                        queue.Add(tr.Id);
                        fictive++;
                    }
                }
            }

            OpponentCommander = Opponents.FirstOrDefault(opp => opp.Type == TrooperType.Commander);
            state             = new State();
            state.Position    = new Point[Team.Count()];
            state.stance      = new int[Team.Count()];
            state.act         = new int[Team.Count()];
            state.hit         = new int[Team.Count()];
            state.medikit     = new bool[Team.Count()];
            state.grenade     = new bool[Team.Count()];
            Troopers          = new Trooper[Team.Count()];
            CommanderId       = -1;
            foreach (var tr in troopers)
            {
                if (tr.IsTeammate)
                {
                    int pos = GetQueuePlace2(tr, true) - 1;
                    state.Position[pos] = new Point(tr);
                    state.stance[pos]   = GetStanceId(tr.Stance);
                    state.medikit[pos]  = tr.IsHoldingMedikit;
                    state.grenade[pos]  = tr.IsHoldingGrenade;
                    Troopers[pos]       = tr;
                    if (tr.Type == TrooperType.Commander)
                    {
                        CommanderId = pos;
                    }
                }
            }
            state.id     = 0;
            state.profit = 0;
            state.act[0] = Troopers[0].ActionPoints;
            MyCount      = state.Position.Count();
            for (var i = 0; i < MyCount; i++)
            {
                state.hit[i] = Troopers[i].Hitpoints;
            }
            for (var i = 1; i < Troopers.Count(); i++)
            {
                state.act[i] = getInitialActionPoints(Troopers[i]);
            }
            stack     = new ArrayList[MyCount];
            bestStack = new ArrayList[MyCount];
            for (var i = 0; i < MyCount; i++)
            {
                stack[i]     = new ArrayList();
                bestStack[i] = null;
            }
            bestProfit     = -Inf;
            counter        = 0;
            OpponentsCount = Opponents.Count();
            MyCount        = state.Position.Count();
            Multiplier     = Math.Min(MyCount, 3);
            state.opphit   = new int[OpponentsCount];
            probab         = new double[OpponentsCount];
            for (var i = 0; i < probab.Length; i++)
            {
                probab[i] = 1.0;
            }
            for (var i = 0; i < OpponentsCount; i++)
            {
                state.opphit[i] = Opponents[i].Hitpoints;
                // Чтобы уменьшить приоритет стрельбы в "мнимую" цель
                if (world.MoveIndex - OpponentsMemoryAppearTime[i] > 1)
                {
                    probab[i] /= 2;
                }
                else if (OpponentsMemoryType[i] == self.Type && world.MoveIndex - OpponentsMemoryAppearTime[i] == 1)
                {
                    probab[i] /= 2;
                }
                // TODO: можно точнее
                else if (!(OpponentsMemoryType[i] == self.Type || IsBetween(OpponentsMemoryType[i], self.Type, Opponents[i].Type)))
                {
                    probab[i] /= 2;
                }
            }
            dfs_changeStance1();

            // remove fictive from queue
            queue.RemoveRange(queue.Count - fictive, fictive);

            var move = new Move();

            ReduceStack(bestStack[0]);
            if (bestStack[0].Count == 0)
            {
                // EndTurn
                bestStack[0].Add("at " + self.X + " " + self.Y);
            }
            var cmd = ((string)bestStack[0][0]).Split(' ');

            if (cmd[0] == "st")
            {
                // Change stance
                var ds = int.Parse(cmd[1]);
                if (ds < 0)
                {
                    move.Action = ActionType.LowerStance;
                }
                else if (ds > 0)
                {
                    move.Action = ActionType.RaiseStance;
                }
                else
                {
                    throw new InvalidDataException();
                }
            }
            else if (cmd[0] == "at")
            {
                var x  = int.Parse(cmd[1]);
                var y  = int.Parse(cmd[2]);
                var to = bestStack[0].Count == 1
                    ? GoScouting(new Point(x, y), new Point(Opponents[0]), changeStanceAllow: true)
                    : GoToUnit(self, new Point(x, y), map, beginFree: true, endFree: false);
                if (to.X == -1)
                {
                    move.Action = to.Y == -1 ? ActionType.LowerStance : ActionType.RaiseStance;
                }
                else
                {
                    move.Action = ActionType.Move;
                    move.X      = to.X;
                    move.Y      = to.Y;
                }
            }
            else if (cmd[0] == "sh")
            {
                var x = int.Parse(cmd[1]);
                var y = int.Parse(cmd[2]);
                move.Action = ActionType.Shoot;
                move.X      = x;
                move.Y      = y;
            }
            else if (cmd[0] == "med")
            {
                var to = new Point(int.Parse(cmd[1]), int.Parse(cmd[2]));
                move.Action = ActionType.UseMedikit;
                move.X      = to.X;
                move.Y      = to.Y;
            }
            else if (cmd[0] == "gr")
            {
                var to = new Point(int.Parse(cmd[1]), int.Parse(cmd[2]));
                move.Action = ActionType.ThrowGrenade;
                move.X      = to.X;
                move.Y      = to.Y;
            }
            else if (cmd[0] == "heal")
            {
                var to = new Point(int.Parse(cmd[1]), int.Parse(cmd[2]));
                move.Action = ActionType.Heal;
                move.X      = to.X;
                move.Y      = to.Y;
            }
            else
            {
                throw new NotImplementedException(cmd.ToString());
            }
            return(move);
        }
Пример #16
0
    public void onUpdate(object sender, EventArgs e)
    {
        if (DateTime.Now.Subtract(LastSecond).TotalMilliseconds > 1000)
        {
            LastSecond = DateTime.Now;
            if (TimeLeft > 0)
            {
                TimeLeft--;

                if (TimeLeft == 0)
                {
                    if (!IsVoteActive())
                    {
                        StartVote();
                    }
                }
                else if (TimeLeft == 30)
                {
                    API.sendChatMessageToAll("Vote for next map will start in 30 seconds!");
                }
                else if (TimeLeft == 59)
                {
                    API.sendChatMessageToAll("Vote for next map will start in 60 seconds!");
                }
            }

            if (RaceStartCountdown > 0)
            {
                RaceStartCountdown--;

                if (RaceStartCountdown == 3)
                {
                    API.triggerClientEventForAll("startRaceCountdown");
                }
                else if (RaceStartCountdown == 0)
                {
                    IsRaceOngoing = true;

                    lock (Opponents)
                        foreach (var opponent in Opponents)
                        {
                            API.setEntityPositionFrozen(opponent.Client, opponent.Vehicle, false);
                            opponent.HasStarted = true;
                        }

                    RaceTimer = DateTime.Now;
                }
            }

            if (VoteEnd > 0)
            {
                VoteEnd--;
                if (VoteEnd == 0)
                {
                    EndRace();
                    var raceWon = AvailableChoices[Votes.OrderByDescending(pair => pair.Value).ToList()[0].Key];
                    API.sendChatMessageToAll("Race ~b~" + raceWon.name + "~w~ has won the vote!");

                    API.sleep(1000);
                    StartRace(raceWon);
                }
            }
        }

        if (!IsRaceOngoing)
        {
            return;
        }

        lock (Opponents)
        {
            var count = 0;
            foreach (var playa in Opponents)
            {
                if (playa.Client.Position.Z <= 0 || playa.Client.Position.Z <= CurrentRace.Checkpoints[0].Z)
                {
                    API.setPlayerHealth(playa.Client, -1);
                    playa.IsAlive = false;
                }

                if (playa.IsAlive)
                {
                    count++;
                }
            }

            if (count <= 1)
            {
                StartVote();
                var winner = Opponents.FirstOrDefault(op => op.IsAlive);
                if (winner != null)
                {
                    API.sendChatMessageToAll("The winner is ~b~" + winner.Client.name + "~w~!");
                }
                else
                {
                    API.sendChatMessageToAll("There are no winners!");
                }

                IsRaceOngoing = false;
            }
        }
    }