Example #1
0
        private void OnPlayerCreated(CreatePlayerPacket p)
        {
            var uep = new UpdateObjectPacket {
                ObjectId = p.ObjectId
            };

            uep.Components.Add(p.Components);
            var go     = OnObjectUpdated(uep);
            var isSelf = false;

            foreach (var c in p.Components)
            {
                switch (c.TypeCase)
                {
                case Component.TypeOneofCase.NetworkBehaviour:
                    isSelf = c.NetworkBehaviour.OwnerToken == SessionManager.Instance.Client.Token;
                    break;
                }
            }
            // Only add camera, etc if it's self client, we don't want to have other clients view !
            if (isSelf)
            {
                go.AddComponent <Camera>().farClipPlane = 2000f;
                go.AddComponent <CameraController>();
                go.AddComponent <AudioListener>(); // No audio anyway ..
                go.AddComponent <TransformNetwork>().id = p.ObjectId;
                var cullingSize = 5000;            // TODO: config or something
                go.AddComponent <Cull>().size = new Vector3(cullingSize, cullingSize, cullingSize);
                go.tag = "MainCamera";
            }
        }
Example #2
0
        public PlayerServer CreateNewPlayer()
        {
            //Assign id based on the next spot in the gameObjectDict.
            int id = gameObjectDict.Count();

            //Create two players, one to send as an active player to client. Other to keep track of on server.
            PlayerServer newPlayer = matchHandler.AddPlayer();

            newPlayer.Register();
            playerServerList.Add(newPlayer);

            //Create the active player with the same id as the newPlayer.
            PlayerServer newActivePlayer = new PlayerServer(newPlayer.Team)
            {
                ObjectType = ObjectType.ACTIVE_PLAYER,
                Id         = newPlayer.Id
            };

            newActivePlayer.Transform.Position = newPlayer.Transform.Position;

            CreatePlayerPacket objPacket = (CreatePlayerPacket)ServerPacketFactory.NewCreatePacket(newPlayer);

            // Sending this new packet before the new client joins.
            networkServer.SendAll(PacketUtil.Serialize(objPacket));

            return(newActivePlayer);
        }
Example #3
0
        public void OnCreatePlayer(IClusterClient client, CreatePlayerPacket packet)
        {
            DbUser dbUser = _database.Users.FirstOrDefault(x => x.Username == packet.Username && x.Password == packet.Password);

            if (dbUser == null)
            {
                _logger.LogWarning($"[SECURITY] Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                                   "Reason: bad presented credentials compared to the database.");
                client.Disconnect();
                return;
            }

            if (_database.Characters.Any(x => x.Name == packet.CharacterName))
            {
                _logger.LogWarning(
                    $"Unable to create new character for user '{packet.Username}' from {client.Socket.RemoteEndPoint}. " +
                    $"Reason: character name '{packet.CharacterName}' already exists.");

                _clusterPacketFactory.SendClusterError(client, ErrorType.USER_EXISTS);
                return;
            }

            DefaultCharacter  defaultCharacter = _clusterServer.ClusterConfiguration.DefaultCharacter;
            DefaultStartItems defaultEquipment = packet.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman;

            if (!_gameResources.Jobs.TryGetValue(packet.Job, out JobData jobData))
            {
                _logger.LogError($"Cannot find job data for job '{packet.Job}' for user '{dbUser.Username}'.");
                client.Disconnect();
                return;
            }

            var newCharacter = new DbCharacter()
            {
                UserId    = dbUser.Id,
                Name      = packet.CharacterName,
                Slot      = (byte)packet.Slot,
                SkinSetId = packet.SkinSet,
                HairColor = (int)packet.HairColor,
                FaceId    = packet.HeadMesh,
                HairId    = packet.HairMeshId,
                BankCode  = packet.BankPassword,
                Gender    = packet.Gender,
                JobId     = (int)packet.Job,
                Hp        = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                          jobData.MaxHpFactor),
                Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence,
                                                   jobData.MaxMpFactor, true),
                Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                   defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true),
                Strength     = defaultCharacter.Strength,
                Stamina      = defaultCharacter.Stamina,
                Dexterity    = defaultCharacter.Dexterity,
                Intelligence = defaultCharacter.Intelligence,
                MapId        = defaultCharacter.MapId,
                PosX         = defaultCharacter.PosX,
                PosY         = defaultCharacter.PosY,
                PosZ         = defaultCharacter.PosZ,
                Level        = defaultCharacter.Level,
                Gold         = defaultCharacter.Gold,
                StatPoints   = 0, //TODO: create default stat point constant.
                SkillPoints  = 0, //TODO: create default skill point constant.
                Experience   = 0,
            };

            //TODO: create game constants for slot.
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47));
            newCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52));

            _database.Characters.Add(newCharacter);
            _database.SaveChanges();

            _logger.LogInformation($"Character '{newCharacter.Name}' has been created successfully for user '{dbUser.Username}' from {client.Socket.RemoteEndPoint}.");

            IEnumerable <DbCharacter> dbCharacters = GetCharacters(dbUser.Id);

            _clusterPacketFactory.SendPlayerList(client, packet.AuthenticationKey, dbCharacters);
        }
Example #4
0
        public static void OnCreatePlayer(ClusterClient client, INetPacketStream packet)
        {
            var         pak = new CreatePlayerPacket(packet);
            var         clusterConfiguration = DependencyContainer.Instance.Resolve <ClusterConfiguration>();
            var         jobs        = DependencyContainer.Instance.Resolve <JobLoader>();
            DbUser      dbUser      = null;
            DbCharacter dbCharacter = null;

            using (var database = DependencyContainer.Instance.Resolve <IDatabase>())
            {
                dbUser = database.Users.Get(x =>
                                            x.Username.Equals(pak.Username, StringComparison.OrdinalIgnoreCase) &&
                                            x.Password.Equals(pak.Password, StringComparison.OrdinalIgnoreCase));

                // Check if user exist and with good password in database.
                if (dbUser == null)
                {
                    Logger.LogWarning(
                        $"[SECURITY] Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                        "Reason: bad presented credentials compared to the database.");
                    client.Disconnect();
                    return;
                }

                dbCharacter = database.Characters.Get(x => x.Name == pak.Name);

                // Check if character name is not already used.
                if (dbCharacter != null)
                {
                    Logger.LogWarning(
                        $"Unable to create new character for user '{pak.Username}' from {client.RemoteEndPoint}. " +
                        $"Reason: character name '{pak.Name}' already exists.");
                    ClusterPacketFactory.SendError(client, ErrorType.USER_EXISTS);
                    return;
                }

                DefaultCharacter  defaultCharacter = clusterConfiguration.DefaultCharacter;
                DefaultStartItems defaultEquipment = pak.Gender == 0 ? defaultCharacter.Man : defaultCharacter.Woman;
                JobData           jobData          = jobs[pak.Job];

                dbCharacter = new DbCharacter()
                {
                    UserId    = dbUser.Id,
                    Name      = pak.Name,
                    Slot      = pak.Slot,
                    SkinSetId = pak.SkinSet,
                    HairColor = (int)pak.HairColor,
                    FaceId    = pak.HeadMesh,
                    HairId    = pak.HairMeshId,
                    BankCode  = pak.BankPassword,
                    Gender    = pak.Gender,
                    ClassId   = pak.Job,
                    Hp        = HealthFormulas.GetMaxOriginHp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                              jobData.MaxHpFactor),
                    Mp = HealthFormulas.GetMaxOriginMp(defaultCharacter.Level, defaultCharacter.Intelligence,
                                                       jobData.MaxMpFactor, true),
                    Fp = HealthFormulas.GetMaxOriginFp(defaultCharacter.Level, defaultCharacter.Stamina,
                                                       defaultCharacter.Dexterity, defaultCharacter.Strength, jobData.MaxFpFactor, true),
                    Strength     = defaultCharacter.Strength,
                    Stamina      = defaultCharacter.Stamina,
                    Dexterity    = defaultCharacter.Dexterity,
                    Intelligence = defaultCharacter.Intelligence,
                    MapId        = defaultCharacter.MapId,
                    PosX         = defaultCharacter.PosX,
                    PosY         = defaultCharacter.PosY,
                    PosZ         = defaultCharacter.PosZ,
                    Level        = defaultCharacter.Level,
                    Gold         = defaultCharacter.Gold,
                    StatPoints   = 0, //TODO: create game constants.
                    SkillPoints  = 0, //TODO: create game constants.
                    Experience   = 0,
                };

                //TODO: create game constants for slot.
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartSuit, 44));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartHand, 46));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartShoes, 47));
                dbCharacter.Items.Add(new DbItem(defaultEquipment.StartWeapon, 52));

                database.Characters.Create(dbCharacter);
                database.Complete();
            }

            Logger.LogInformation("Character '{0}' has been created successfully for user '{1}' from {2}.",
                                  dbCharacter.Name, pak.Username, client.RemoteEndPoint);

            ClusterPacketFactory.SendPlayerList(client, pak.AuthenticationKey, dbUser.Characters);
        }