示例#1
0
        public static void Handle(Entities.GameClient client, GeneralDataPacket General)
        {
            client.AttackPacket = null;

            if (client.Booth != null)
            {
                client.Booth.CancelBooth();
            }
            if (client.DynamicMap != null)
            {
                if (!client.LeaveDynamicMap())
                {
                    client.NetworkClient.Disconnect("FAILED_TO_PORTAL_DYNAMIC_MAP");
                }
                return;
            }
            if (client.Map.InheritanceMap == client.Map.MapID)
            {
                Core.PortalPoint StartLocation = new Core.PortalPoint(client.Map.MapID, General.Data1Low, General.Data1High);
                if (Core.Screen.ValidDistance(client.X, client.Y, StartLocation.X, StartLocation.Y))
                {
                    if (Core.Kernel.Portals.ContainsKey(StartLocation))
                    {
                        Core.PortalPoint Destination;
                        if (Core.Kernel.Portals.TryGetValue(StartLocation, out Destination))
                        {
                            client.Teleport(Destination.MapID, Destination.X, Destination.Y);
                            return;
                        }
                    }
                }
            }
            client.Teleport(client.Map.MapID, client.LastX, client.LastY);
        }
示例#2
0
 public void LeaveWatcher(Entities.GameClient Watcher)
 {
     Watcher.CanAttack = true;
     if (!Watcher.LeaveDynamicMap())
     {
         Watcher.NetworkClient.Disconnect("Could not leave dynamic map...");
     }
     else
     {
         Watchers.Remove(Watcher);
         Watcher.Arena.Status = Enums.ArenaStatus.NotSignedUp;
         using (var wait = Watcher.Arena.Build())
             Watcher.Send(wait);
     }
 }
示例#3
0
        public void EndMatch()
        {
            if (EndedAlready)
            {
                return;
            }
            EndedAlready = true;

            bool IsBotMatch = (Player1.IsAIBot || Player2.IsAIBot);

            Player1.Equipments.ClearMask();
            if (Player2 != null)
            {
                Player2.Equipments.ClearMask();
            }
            Player1.ArenaMatch = null;
            if (Player2 != null)
            {
                Player2.ArenaMatch = null;
            }
            Player1.Battle = null;
            if (Player2 != null)
            {
                Player2.Battle = null;
            }

            SendEnd();

            if (Player2 != null)
            {
                uint WinAmount  = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next(32, 113);
                uint LoseAmount = (uint)ProjectX_V3_Lib.ThreadSafe.RandomGenerator.Generator.Next((int)(WinAmount / 3), (int)(WinAmount / 2));
                LoseAmount /= 2;

                if (IsBotMatch)
                {
                    WinAmount  = 0;
                    LoseAmount = 0;
                }

                if (Player1Damage == Player2Damage)
                {
                    Player1.WasInArena = true;
                    Player2.WasInArena = true;
                    Player1.LostArena  = true;
                    Player2.LostArena  = true;

                    // draw
                    if (!IsBotMatch)
                    {
                        Player1.Arena.ArenaHonorPoints += LoseAmount;
                        Player2.Arena.ArenaHonorPoints += LoseAmount;

                        using (var msg = Packets.Message.MessageCore.CreateSystem2("ALL", string.Format(Core.MessageConst.ARENA_DRAW, Player1.Name, Player2.Name)))
                        {
                            Packets.Message.MessageCore.SendGlobalMessage(msg);
                        }
                    }
                }
                else if (Player1Damage > Player2Damage)
                {
                    Player1.WasInArena = true;
                    Player2.WasInArena = true;
                    Player2.LostArena  = true;
                    Player1.LostArena  = false;

                    if (!IsBotMatch)
                    {
                        // player1 win
                        Player1.Arena.ArenaHonorPoints += WinAmount;
                        Player2.Arena.ArenaHonorPoints -= LoseAmount;

                        Player1.Arena.ArenaWinsToday++;
                        Player1.Arena.ArenaTotalWins++;
                        //Player1.Send(arenaAction);

                        Player2.Arena.ArenaLossToday++;
                        Player2.Arena.ArenaTotalLoss++;

                        using (var msg = Packets.Message.MessageCore.CreateSystem2("ALL", string.Format(Core.MessageConst.ARENA_WIN, Player1.Name, Player2.Name)))
                        {
                            Packets.Message.MessageCore.SendGlobalMessage(msg);
                        }
                    }
                }
                else
                {
                    Player1.WasInArena = true;
                    Player2.WasInArena = true;
                    Player1.LostArena  = true;
                    Player2.LostArena  = false;

                    // player 2 win

                    if (!IsBotMatch)
                    {
                        Player2.Arena.ArenaHonorPoints += WinAmount;
                        Player1.Arena.ArenaHonorPoints -= LoseAmount;

                        Player2.Arena.ArenaWinsToday++;
                        Player2.Arena.ArenaTotalWins++;

                        Player1.Arena.ArenaLossToday++;
                        Player1.Arena.ArenaTotalLoss++;

                        using (var msg = Packets.Message.MessageCore.CreateSystem2("ALL", string.Format(Core.MessageConst.ARENA_WIN, Player2.Name, Player1.Name)))
                        {
                            Packets.Message.MessageCore.SendGlobalMessage(msg);
                        }
                    }
                }
            }

            if (!Player1.LeaveDynamicMap())
            {
                Player1.NetworkClient.Disconnect("Could not leave arena...");
            }
            Player1.ForceRevive();
            if (Player2 != null)
            {
                if (!Player2.LeaveDynamicMap())
                {
                    Player2.NetworkClient.Disconnect("Could not leave arena...");
                }
                Player2.ForceRevive();
            }

            KickWatchers();

            if (Player2 != null)
            {
                if (!IsBotMatch)
                {
                    Player1.Arena.Save();
                    Player2.Arena.Save();
                }
            }
            ArenaQualifier.GetTop10();

            Player1.Arena.Status = Enums.ArenaStatus.NotSignedUp;
            using (var wait = Player1.Arena.Build())
                Player1.Send(wait);

            if (Player2 != null)
            {
                Player2.Arena.Status = Enums.ArenaStatus.NotSignedUp;
                using (var wait = Player2.Arena.Build())
                    Player2.Send(wait);
            }

            Player1 = null;
            Player2 = null;

            ArenaQualifier.MatchQueue.Remove(this);
        }