예제 #1
0
        public static void Initialize(ProudNet.Configuration config)
        {
            if (Instance != null)
            {
                throw new InvalidOperationException("Server is already initialized");
            }

            config.Version          = new Guid("{97d36acf-8cc0-4dfb-bcc9-97cab255e2bc}");
            config.MessageFactories = new MessageFactory[] { new ChatMessageFactory() };
            config.SessionFactory   = new ChatSessionFactory();
            config.Logger           = Logger.ForContext(Constants.SourceContextPropertyName, "ChatServer-ProudNet");

            // ReSharper disable InconsistentNaming
            Predicate <ChatSession> MustBeLoggedIn    = session => session.IsLoggedIn();
            Predicate <ChatSession> MustNotBeLoggedIn = session => !session.IsLoggedIn();
            Predicate <ChatSession> MustBeInChannel   = session => session.Player.Channel != null;

            // ReSharper restore InconsistentNaming

            config.MessageHandlers = new IMessageHandler[]
            {
                new FilteredMessageHandler <ChatSession>()
                .AddHandler(new AuthService())
                .AddHandler(new CommunityService())
                .AddHandler(new ChannelService())
                .AddHandler(new PrivateMessageService())

                .RegisterRule <CLoginReqMessage>(MustNotBeLoggedIn)
                .RegisterRule <CSetUserDataReqMessage>(MustBeLoggedIn)
                .RegisterRule <CGetUserDataReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CDenyChatReqMessage>(MustBeLoggedIn)
                .RegisterRule <CChatMessageReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CWhisperChatMessageReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CNoteListReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CReadNoteReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CDeleteNoteReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <CSendNoteReqMessage>(MustBeLoggedIn, MustBeInChannel)
            };
            Instance = new ChatServer(config);
        }
        public static void Initialize(Configuration config)
        {
            if (Instance != null)
            {
                throw new InvalidOperationException("Server is already initialized");
            }

            config.Version          = new Guid("{97d36acf-8cc0-4dfb-bcc9-97cab255e2bc}");
            config.MessageFactories = new MessageFactory[] { new ChatMessageFactory(), new ClubMessageFactory() };
            config.SessionFactory   = new ChatSessionFactory();

            // ReSharper disable InconsistentNaming
            Predicate <ChatSession> MustBeLoggedIn    = session => session.IsLoggedIn();
            Predicate <ChatSession> MustNotBeLoggedIn = session => !session.IsLoggedIn();
            Predicate <ChatSession> MustBeInChannel   = session => session.Player.Channel != null;

            // ReSharper restore InconsistentNaming

            config.MessageHandlers = new IMessageHandler[]
            {
                new FilteredMessageHandler <ChatSession>()
                .AddHandler(new AuthService())
                .AddHandler(new CommunityService())
                .AddHandler(new ChannelService())
                .AddHandler(new PrivateMessageService())
                .AddHandler(new ClubService())

                .RegisterRule <LoginReqMessage>(MustNotBeLoggedIn)
                .RegisterRule <UserDataOneReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <DenyActionReqMessage>(MustBeLoggedIn)
                .RegisterRule <MessageChatReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <MessageWhisperChatReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <NoteListReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <NoteReadReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <NoteDeleteReqMessage>(MustBeLoggedIn, MustBeInChannel)
                .RegisterRule <NoteSendReqMessage>(MustBeLoggedIn, MustBeInChannel)
            };
            Instance = new ChatServer(config);
        }
예제 #3
0
        private GameServer()
            : base(new GameSessionFactory(), ArrayPool <byte> .Create(1 * 1024 * 1024, 50), Config.Instance.PlayerLimit)
        {
            #region Filter Setup

            var config      = new ProudConfig(new Guid("{beb92241-8333-4117-ab92-9b4af78c688f}"));
            var proudFilter = new ProudServerPipe(config);
#if DEBUG
            proudFilter.UnhandledProudCoreMessage += (s, e) => Logger.Warn().Message("Unhandled ProudCoreMessage {0}", e.Message.GetType().Name).Write();
            proudFilter.UnhandledProudMessage     +=
                (s, e) => Logger.Warn().Message("Unhandled UnhandledProudMessage {0}: {1}", e.Message.GetType().Name, e.Message.ToArray().ToHexString()).Write();
#endif
            Pipeline.AddFirst("proudnet", proudFilter);
            Pipeline.AddLast("s4_protocol", new NetspherePipe(new GameMessageFactory()));

            Pipeline.AddLast("firewall", new FirewallPipe())
            .Add(new PacketFirewallRule <GameSession>())
            .Get <PacketFirewallRule <GameSession> >()

            .Register <CLoginReqMessage>(s => !s.IsLoggedIn())
            .Register <CCreateCharacterReqMessage>(s => s.IsLoggedIn())
            .Register <CSelectCharacterReqMessage>(s => s.IsLoggedIn())
            .Register <CDeleteCharacterReqMessage>(s => s.IsLoggedIn())
            .Register <CAdminShowWindowReqMessage>(s => s.IsLoggedIn())
            .Register <CAdminActionReqMessage>(s => s.IsLoggedIn())
            .Register <CGetChannelInfoReqMessage>(s => s.IsLoggedIn())
            .Register <CChannelEnterReqMessage>(s => s.IsLoggedIn() && s.Player.Channel == null)
            .Register <CChannelLeaveReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null)
            .Register <CNewShopUpdateCheckReqMessage>(s => s.IsLoggedIn())
            .Register <CLicensedReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null)
            .Register <CExerciseLicenceReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null)
            .Register <CBuyItemReqMessage>(s => s.IsLoggedIn())
            .Register <CRandomShopRollingStartReqMessage>(s => s.IsLoggedIn())
            .Register <CRandomShopItemSaleReqMessage>(s => s.IsLoggedIn())
            .Register <CUseItemReqMessage>(s => s.IsLoggedIn())
            .Register <CRepairItemReqMessage>(s => s.IsLoggedIn())
            .Register <CRefundItemReqMessage>(s => s.IsLoggedIn())
            .Register <CDiscardItemReqMessage>(s => s.IsLoggedIn())
            .Register <CEnterPlayerReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.IsConnecting)
            .Register <CMakeRoomReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room == null)
            .Register <CGameRoomEnterReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room == null)
            .Register <CJoinTunnelInfoReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null)
            .Register <CChangeTeamReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null)
            .Register <CPlayerGameModeChangeReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null)

            .Register <CScoreKillReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreKillAssistReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreOffenseReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreOffenseAssistReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreDefenseReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreDefenseAssistReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreTeamKillReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreHealAssistReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreSuicideReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreReboundReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.Room.Host == s.Player && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)
            .Register <CScoreGoalReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.Room.Host == s.Player && s.Player.RoomInfo.State != PlayerState.Lobby && s.Player.RoomInfo.State != PlayerState.Spectating)

            .Register <CBeginRoundReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.Room.Master == s.Player)
            .Register <CReadyRoundReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State == PlayerState.Lobby)
            .Register <CEventMessageReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null)
            .Register <CItemsChangeReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player.RoomInfo.State == PlayerState.Lobby)
            .Register <CAvatarChangeReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && (s.Player.RoomInfo.State == PlayerState.Lobby || s.Player.Room.GameRuleManager.GameRule.StateMachine.IsInState(GameRuleState.HalfTime)))
            .Register <CChangeRuleNotifyReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null && s.Player.Room != null && s.Player == s.Player.Room.Master && s.Player.Room.GameRuleManager.GameRule.StateMachine.IsInState(GameRuleState.Waiting))

            .Register <CClubAddressReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null)
            .Register <CClubInfoReqMessage>(s => s.IsLoggedIn() && s.Player.Channel != null);

            //FilterList.AddLast("spam_filter", new SpamFilter { RepeatLimit = 30, TimeFrame = TimeSpan.FromSeconds(3) });

            Pipeline.AddLast("s4_service", new ServicePipe())
            .Add(new AuthService())
            .Add(new CharacterService())
            .Add(new GeneralService())
            .Add(new AdminService())
            .Add(new ChannelService())
            .Add(new ShopService())
            .Add(new InventoryService())
            .Add(new RoomService())
            .Add(new ClubService())
            .UnhandledMessage += OnUnhandledMessage;

            #endregion

            RegisterMappings();

            //ServerTime = TimeSpan.Zero;
            _chatServer = new ChatServer(this);
            RelayServer = new RelayServer(this);

            CommandManager = new CommandManager(this);
            CommandManager.Add(new ServerCommand())
            .Add(new ReloadCommand())
            .Add(new GameCommands())
            .Add(new InventoryCommands());

            PlayerManager  = new PlayerManager();
            ResourceCache  = new ResourceCache();
            ChannelManager = new ChannelManager(ResourceCache.GetChannels());

            _worker     = new ThreadLoop(TimeSpan.FromMilliseconds(100), (Action <TimeSpan>)Worker);
            _authWebAPI = new AuthWebAPIClient();
        }