示例#1
0
文件: Channel.cs 项目: KingCrazy/S115
        public void Join(Player plr)
        {
            _players.TryAdd(plr.Session.Guid, plr);
            plr.Channel = this;

            if (ServerType != EServerType.Chat) return;
            var ack = new Packet(EChatPacket.SChannelPlayerJoinedAck);
            ack.Write((uint)ID);
            ack.WriteChatUserData(plr);
            Broadcast(ack, plr.AccountID);
        }
示例#2
0
 public void CreatePlayer(Player plr)
 {
     using (var con = GetConnection())
     {
         using (var cmd = BuildQuery(con, "INSERT INTO accounts(ID, Nickname, Level, PEN, AP, GMLevel) VALUES(@ID, @Nickname, @Level, @PEN, @AP, @GMLevel); INSERT INTO account_tdstats(ID) VALUES(@ID); INSERT INTO account_dmstats(ID) VALUES(@ID);",
             "@ID", plr.AccountID, "@Nickname", plr.Nickname, "@Level", plr.Level, "@PEN", plr.PEN, "@AP", plr.AP, "@GMLevel", plr.GMLevel))
         {
             cmd.ExecuteNonQuery();
         }
     }
 }
示例#3
0
        public override bool OnReadyRound(Player plr, Room room)
        {
            var rule = CheckRule(room);
            if (rule == null) return false;

            if (CheckEquip(plr, rule)) return false;

            var ack = new Packet(EGamePacket.SResultAck);
            ack.Write((uint)EServerResult.WearingUnusbleItem);
            plr.Session.Send(ack);
            return true;
        }
示例#4
0
文件: Channel.cs 项目: KingCrazy/S115
        public void Leave(Player plr)
        {
            Player tmp;
            _players.TryRemove(plr.Session.Guid, out tmp);
            plr.Channel = null;

            if (ServerType != EServerType.Chat) return;
            var ack = new Packet(EChatPacket.SChannelPlayerLeftAck);
            ack.Write((uint)ID);
            ack.Write(plr.AccountID);
            Broadcast(ack);
        }
示例#5
0
 public override void OnBuyItem(Player plr, List<Item> itemsToBuy)
 {
     foreach (var item in itemsToBuy)
         item.EffectID = 0;
 }
示例#6
0
 public void UpdateTutorialFlag(Player plr)
 {
     using (var con = GetConnection())
     {
         using (var cmd = BuildQuery(con,
             "UPDATE accounts SET TutorialCompleted=@TC WHERE ID=@ID",
             "@TC", plr.TutorialCompleted, "@ID", plr.AccountID))
         {
             cmd.ExecuteNonQuery();
         }
     }
 }
示例#7
0
 public void UpdateMoney(Player plr)
 {
     using (var con = GetConnection())
     {
         using (var cmd = BuildQuery(con,
             "UPDATE accounts SET PEN=@PEN, AP=@AP WHERE ID=@ID",
             "@PEN", plr.PEN, "@AP", plr.AP, "@ID", plr.AccountID))
         {
             cmd.ExecuteNonQuery();
         }
     }
 }
示例#8
0
 public void UpdateEXPLevel(Player plr)
 {
     using (var con = GetConnection())
     {
         using (var cmd = BuildQuery(con,
             "UPDATE accounts SET EXP=@EXP, Level=@Level WHERE ID=@ID",
             "@EXP", plr.EXP, "@Level", plr.Level, "@ID", plr.AccountID))
         {
             cmd.ExecuteNonQuery();
         }
     }
 }
示例#9
0
        public Player GetPlayer(ulong accID)
        {
            using (var con = GetConnection())
            {
                using (var cmd = BuildQuery(con, "SELECT * FROM accounts WHERE ID=@ID", "@ID", accID))
                {
                    using (var r = cmd.ExecuteReader())
                    {
                        if (!r.Read())
                            return null;

                        var player = new Player
                        {
                            AccountID = (ulong) r.GetInt64("ID"),
                            Nickname = r.GetString("Nickname"),
                            EXP = (uint) r.GetInt32("EXP"),
                            Level = (uint) r.GetInt32("Level"),
                            TutorialCompleted = (r.GetByte("TutorialCompleted") > 0),
                            ActiveCharSlot = r.GetByte("ActiveCharSlot"),
                            PEN = (uint) r.GetInt32("PEN"),
                            AP = (uint) r.GetInt32("AP"),
                            GMLevel = r.GetByte("GMLevel"),
                            Licenses = GetLicenses(accID),
                            Inventory = GetInventory(accID),
                            Characters = GetCharacters(accID),
                            TDStats = GetTDStats(accID),
                            DMStats = GetDMStats(accID),
                            DenyList = GetDenyList(accID),
                            FriendList = GetFriendList(accID)
                        };
                        return player;
                    }
                }
            }
        }
示例#10
0
 public virtual bool OnBeginRound(Player plr, Room room)
 {
     return false;
 }
示例#11
0
 public override bool OnCreateRoom(Player plr, Room room)
 {
     room.IsBalanced = false;
     return false;
 }
示例#12
0
 public virtual bool OnReadyRound(Player plr, Room room)
 {
     return false;
 }
示例#13
0
 public virtual bool OnCreateRoom(Player plr, Room room)
 {
     return false;
 }
示例#14
0
 public virtual void OnBuyItem(Player plr, List<Item> itemsToBuy)
 {
 }
示例#15
0
文件: Room.cs 项目: KingCrazy/S115
        public void Join(Player plr)
        {
            plr.Room = this;
            if (ServerType == EServerType.Game)
            {
                plr.ResetScore();
                plr.State = EPlayerState.Lobby;
            }
            _players.TryAdd(plr.Session.Guid, plr);

            if (ServerType != EServerType.Game) return;

            var ack = new Packet(EGamePacket.SEnterRoomSuccessAck);
            ack.Write(ID);
            ack.Write(MatchKey);
            ack.Write((uint)State);
            ack.Write((uint)TimeState);
            ack.Write(TimeLimit);

            var ts = DateTime.Now - StartTime;
            if(State == EGameRuleState.Waiting || State == EGameRuleState.Result)
                ack.Write((uint)0);
            else
                ack.Write((uint)ts.TotalMilliseconds); // time passed
            ack.Write(ScoreLimit);
            ack.Write(IsFriendly);
            ack.Write(IsBalanced);
            ack.Write(MinLevel);
            ack.Write(MaxLevel);
            ack.Write(EquipLimit);
            ack.Write(IsNoIntrusion);
            plr.Session.Send(ack);

            // Generate unique slot id!
            var slotID = 2;
            while (FindPlayerInSlot(slotID) != null)
                slotID++;
            plr.SlotID = (byte)slotID;

            ack = new Packet(EGamePacket.SIdsInfoAck);
            ack.Write(plr.SlotID);
            ack.Write(TunnelID);
            ack.Write((uint)0);
            plr.Session.Send(ack);

            ack = new Packet(EGamePacket.SPlayerEnteredAck);
            ack.Write((byte)0x00);
            ack.Write((byte)_players.Count);

            foreach (var player in _players.Values)
            {
                ack.Write(player.PrivateIP); // private ip
                ack.Write(player.PrivatePort); // private port
                ack.Write(player.PublicIP); // public ip
                ack.Write(player.PublicPort); // public port
                ack.Write(player.NATUnk);
                ack.Write(player.ConnectionType); // connection type | 6 relay
                ack.Write(player.AccountID);
                ack.Write(player.SlotID);
                ack.Write((uint)0);
                ack.Write((byte)0x01);
                ack.WriteStringBuffer(player.Nickname, 31);
            }
            Broadcast(ack);
        }
示例#16
0
        private bool CheckEquip(Player plr, string rule)
        {
            if (!_database.ContainsKey(rule))
                return true;

            foreach (var itm in _database[rule])
            {
                var character = plr.Characters.FirstOrDefault(c => c.Slot == plr.ActiveCharSlot);
                if(character == null) continue;

                if ((from w in character.Weapons where w != 0 select plr.Inventory.First(e => e.ID == w)).Any(i => i.Category == itm.Category && i.SubCategory == itm.SubCategory && i.ItemID == itm.ItemID))
                    return false;
                if ((from w in character.Clothes where w != 0 select plr.Inventory.First(e => e.ID == w)).Any(i => i.Category == itm.Category && i.SubCategory == itm.SubCategory && i.ItemID == itm.ItemID))
                    return false;

                if(character.Skill == 0) continue;
                var skill = plr.Inventory.First(e => e.ID == character.Skill);
                if (skill.Category == itm.Category && skill.SubCategory == itm.SubCategory && skill.ItemID == itm.ItemID) return false;
            }

            return true;
        }
示例#17
0
文件: Room.cs 项目: KingCrazy/S115
        public void Leave(Player plr, byte leaveType = 0)
        {
            Packet ack;
            if (ServerType == EServerType.Game)
            {
                ack = new Packet(EGamePacket.SRoomPlayerLeave);
                ack.Write(plr.AccountID);
                ack.WriteStringBuffer(plr.Nickname, 31);
                ack.Write(leaveType); // leave reason | 1 = kick
                Broadcast(ack);

                ack = new Packet(EGamePacket.SPlayerLeaveAck);
                ack.Write(plr.AccountID);
                ack.Write(plr.SlotID);
                Broadcast(ack);
            }

            Player tmp;
            if (!_players.TryRemove(plr.Session.Guid, out tmp)) return;
            plr.IsReady = false;
            plr.State = EPlayerState.Lobby;
            plr.SlotID = 0;
            plr.Room = null;
            plr.Team = ETeam.Neutral;
            plr.GameMode = EPlayerGameMode.Normal;
            plr.ResetScore();

            if (_players.Count == 0)
            {
                Room roomTEMP;
                RoomCollection.TryRemove(TunnelID, out roomTEMP);

                if (Channel == null || ServerType != EServerType.Game) return;
                ack = new Packet(EGamePacket.SDisposeRoomAck);
                ack.Write(ID);
                Channel.Broadcast(ack);
                return;
            }

            if (ServerType != EServerType.Game) return;
            if (MasterID == plr.AccountID) // master left, we need a new one
            {
                MasterID = _players.First().Value.AccountID;
                ack = new Packet(EGamePacket.SRoomChangeRefereeAck);
                ack.Write(MasterID);
                Broadcast(ack);

                ack = new Packet(EGamePacket.SRoomChangeMasterAck);
                ack.Write(MasterID);
                Broadcast(ack);
            }

            if (State == EGameRuleState.Playing && ( (CountInTeam(ETeam.Alpha) == 0 || CountInTeam(ETeam.Beta) == 0) 
                || (CountInTeamPlaying(ETeam.Alpha) == 0 || CountInTeamPlaying(ETeam.Beta) == 0) ))
                BeginResult();
        }
示例#18
0
 public virtual string OnAdminAction(Player sender, string[] args)
 {
     return "";
 }