コード例 #1
0
        /// <summary>
        /// Creates a new <see cref="MapLayer"/> instance.
        /// </summary>
        /// <param name="parent">Parent map instance</param>
        /// <param name="id">Map layer id</param>
        public MapLayer(IMapInstance parent, int id)
        {
            this.Id       = id;
            this.Parent   = parent;
            this._regions = new List <IMapRegion>();

            foreach (IMapRegion region in this.Parent.Regions)
            {
                if (region is IMapRespawnRegion respawner)
                {
                    var respawnerRegion = respawner.Clone() as IMapRespawnRegion;

                    if (respawnerRegion.ObjectType == WorldObjectType.Mover)
                    {
                        var moverData = GameResources.Instance.Movers[respawnerRegion.ModelId];
                        for (var i = 0; i < respawnerRegion.Count; i++)
                        {
                            respawnerRegion.Entities.Add(this.CreateMonster(moverData, respawnerRegion));
                        }
                    }
                    else if (respawnerRegion.ObjectType == WorldObjectType.Item)
                    {
                        var itemData = GameResources.Instance.Items.GetItem(respawnerRegion.ModelId);
                        for (var i = 0; i < respawnerRegion.Count; i++)
                        {
                            respawnerRegion.Entities.Add(this.CreateWorldItem(itemData, respawnerRegion));
                        }
                    }

                    this._regions.Add(respawnerRegion);
                }
            }
        }
コード例 #2
0
ファイル: MapFactory.cs プロジェクト: zero16832/Rhisis
        /// <inheritdoc />
        public IMapLayer CreateLayer(IMapInstance parentMapInstance, int layerId)
        {
            var mapLayer = ActivatorUtilities.CreateInstance <MapLayer>(_serviceProvider, parentMapInstance, layerId);

            foreach (IMapRegion region in parentMapInstance.Regions)
            {
                if (region is IMapRespawnRegion respawnRegion)
                {
                    if (respawnRegion.ObjectType == WorldObjectType.Mover)
                    {
                        for (int i = 0; i < respawnRegion.Count; i++)
                        {
                            IMonsterEntity monster = _monsterFactory.CreateMonster(parentMapInstance, mapLayer, respawnRegion.ModelId, respawnRegion);

                            mapLayer.AddEntity(monster);
                        }
                    }
                    else if (respawnRegion.ObjectType == WorldObjectType.Item)
                    {
                        var item = _itemFactory.CreateItem(respawnRegion.ModelId, 0, 0, 0);

                        for (int i = 0; i < respawnRegion.Count; ++i)
                        {
                            IItemEntity itemEntity = _itemFactory.CreateItemEntity(parentMapInstance, mapLayer, item);
                            itemEntity.Object.Position = respawnRegion.GetRandomPosition();
                            itemEntity.Region          = respawnRegion;

                            mapLayer.AddEntity(itemEntity);
                        }
                    }
                }
            }

            return(mapLayer);
        }
コード例 #3
0
        /// <inheritdoc />
        public void Teleport(IPlayerEntity player, int mapId, float x, float?y, float z, float angle = 0)
        {
            if (player.Object.MapId != mapId)
            {
                IMapInstance destinationMap = _mapManager.GetMap(mapId);

                if (destinationMap == null)
                {
                    _logger.LogError($"Cannot find map with id '{mapId}'.");
                    _textPacketFactory.SendSnoop(player, $"Cannot find map with id '{mapId}'.");
                    return;
                }

                if (!destinationMap.ContainsPosition(new Vector3(x, 0, z)))
                {
                    _logger.LogError($"Cannot teleport. Destination position is out of map bounds.");
                    return;
                }

                _visibilitySystem.DespawnEntity(player);
                player.Object.Spawned    = false;
                player.Object.CurrentMap = _mapManager.GetMap(destinationMap.Id);
                player.Object.MapId      = destinationMap.Id;
                player.Object.LayerId    = destinationMap.DefaultMapLayer.Id;

                // TODO: get map height at x/z position
                float positionY = y ?? 100;
                player.Object.Position    = new Vector3(x, positionY, z);
                player.Object.MovingFlags = ObjectState.OBJSTA_STAND;
                player.Moves.DestinationPosition.Reset();
                player.Battle.Reset();
                player.Follow.Reset();

                _playerPacketFactory.SendPlayerReplace(player);
                _worldSpawnPacketFactory.SendPlayerSpawn(player);
                player.Object.Spawned = true;
            }
            else
            {
                if (!player.Object.CurrentMap.ContainsPosition(new Vector3(x, 0, z)))
                {
                    _logger.LogError($"Cannot teleport. Destination position is out of map bounds.");
                    return;
                }

                // TODO: get map height at x/z position
                float positionY = y ?? 100;
                player.Object.Position    = new Vector3(x, positionY, z);
                player.Object.MovingFlags = ObjectState.OBJSTA_STAND;
                player.Moves.DestinationPosition.Reset();
                player.Battle.Reset();
                player.Follow.Reset();
            }

            _playerPacketFactory.SendPlayerTeleport(player);
        }
コード例 #4
0
        /// <inheritdoc />
        public void Execute(IEntity entity, SystemEventArgs args)
        {
            if (!(entity is IPlayerEntity player))
            {
                this._logger.LogError($"Cannot execute DeathSystem. {entity.Object.Name} is not a player.");
                return;
            }

            IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position);

            if (revivalRegion == null)
            {
                this._logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'.");
                return;
            }

            decimal recoveryRate = GameResources.Instance.Penalities.GetRevivalPenality(player.Object.Level) / 100;
            var     jobData      = player.PlayerData.JobData;

            int strength     = player.Attributes[DefineAttributes.STR];
            int stamina      = player.Attributes[DefineAttributes.STA];
            int dexterity    = player.Attributes[DefineAttributes.DEX];
            int intelligence = player.Attributes[DefineAttributes.INT];

            player.Health.Hp = (int)(HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, jobData.MaxHpFactor) * recoveryRate);
            player.Health.Mp = (int)(HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, jobData.MaxMpFactor, true) * recoveryRate);
            player.Health.Fp = (int)(HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, jobData.MaxFpFactor, true) * recoveryRate);

            if (player.Object.MapId != revivalRegion.MapId)
            {
                IMapInstance revivalMap = this._mapLoader.GetMapById(revivalRegion.MapId);

                if (revivalMap == null)
                {
                    this._logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'.");
                    player.Connection.Server.DisconnectClient(player.Connection.Id);
                    return;
                }

                revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key);
            }

            var teleportEvent = new TeleportEventArgs(revivalRegion.MapId, revivalRegion.RevivalPosition.X, revivalRegion.RevivalPosition.Z);

            player.NotifySystem <TeleportSystem>(teleportEvent);

            WorldPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_ACC_STOP | ObjectMessageType.OBJMSG_STOP_TURN | ObjectMessageType.OBJMSG_STAND);
            WorldPacketFactory.SendPlayerRevival(player);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Health.Hp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Health.Mp);
            WorldPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Health.Fp);

            this.ProcessDeathPenality(player);
        }
コード例 #5
0
        /// <inheritdoc />
        public IMonsterEntity CreateMonster(IMapInstance currentMap, IMapLayer currentMapLayer, int moverId, IMapRespawnRegion region, bool respawn = false)
        {
            if (!_gameResources.Movers.TryGetValue(moverId, out MoverData moverData))
            {
                throw new ArgumentException($"Cannot find mover with id '{moverId}' in game resources.", nameof(moverId));
            }

            var monster = new MonsterEntity
            {
                Object = new ObjectComponent
                {
                    ModelId     = moverId,
                    Name        = moverData.Name,
                    Level       = moverData.Level,
                    Type        = WorldObjectType.Mover,
                    Size        = ObjectComponent.DefaultObjectSize,
                    MovingFlags = ObjectState.OBJSTA_STAND,
                    Position    = region.GetRandomPosition(),
                    Angle       = RandomHelper.FloatRandom(0, 360f),
                    Spawned     = true,
                    AbleRespawn = respawn,
                    CurrentMap  = currentMap,
                    LayerId     = currentMapLayer.Id
                },
                Timers = new TimerComponent
                {
                    NextMoveTime = Time.TimeInSeconds() + RandomHelper.LongRandom(8, 20)
                }
            };

            monster.Moves = new MovableComponent
            {
                Speed = moverData.Speed
            };

            monster.Data   = moverData;
            monster.Region = region;
            monster.Attributes[DefineAttributes.HP]  = moverData.AddHp;
            monster.Attributes[DefineAttributes.MP]  = moverData.AddMp;
            monster.Attributes[DefineAttributes.STR] = moverData.Strength;
            monster.Attributes[DefineAttributes.STA] = moverData.Stamina;
            monster.Attributes[DefineAttributes.DEX] = moverData.Dexterity;
            monster.Attributes[DefineAttributes.INT] = moverData.Intelligence;
            monster.Behavior = _behaviorManager.GetBehavior(BehaviorType.Monster, monster, moverId);
            monster.Hand     = _itemFactory.CreateItem(11, 0, ElementType.None, 0);

            if (moverData.Class == MoverClassType.RANK_BOSS)
            {
                monster.Object.Size *= 2;
            }

            return(monster);
        }
コード例 #6
0
ファイル: MapFactory.cs プロジェクト: zero16832/Rhisis
        /// <summary>
        /// Load NPC from the DYO file.
        /// </summary>
        private void LoadDyo(string mapPath, IMapInstance map)
        {
            string dyo = Path.Combine(mapPath, $"{map.Name}.dyo");

            using var dyoFile = new DyoFile(dyo);
            IEnumerable <NpcDyoElement> npcElements = dyoFile.GetElements <NpcDyoElement>();

            foreach (NpcDyoElement element in npcElements)
            {
                map.AddEntity(_npcFactory.CreateNpc(map, element));
            }
        }
コード例 #7
0
        /// <summary>
        /// Teleports the player to the given map and position.
        /// </summary>
        /// <param name="player">Player.</param>
        /// <param name="e">Teleport args.</param>
        private void Teleport(IPlayerEntity player, TeleportEventArgs e)
        {
            if (player.Object.MapId != e.MapId)
            {
                IMapInstance destinationMap = this._mapLoader.GetMapById(e.MapId);

                if (destinationMap == null)
                {
                    this._logger.LogError($"Cannot find map with id '{e.MapId}'.");
                    WorldPacketFactory.SendSnoop(player, $"Cannot find map with id '{e.MapId}'.");
                    return;
                }

                if (!destinationMap.ContainsPosition(new Vector3(e.PositionX, 0, e.PositionZ)))
                {
                    this._logger.LogError($"Cannot teleport. Destination position is out of map bounds.");
                    return;
                }

                IMapLayer defaultMapLayer = destinationMap.GetDefaultMapLayer();
                player.SwitchContext(defaultMapLayer);
                player.Object.Spawned = false;
                player.Object.MapId   = destinationMap.Id;
                player.Object.LayerId = defaultMapLayer.Id;

                // TODO: get map height at x/z position
                float positionY = e.PositionY ?? 100;
                player.Object.Position           = new Vector3(e.PositionX, positionY, e.PositionZ);
                player.Moves.DestinationPosition = player.Object.Position.Clone();

                WorldPacketFactory.SendReplaceObject(player);
                WorldPacketFactory.SendPlayerSpawn(player);
                player.Object.Spawned = true;
            }
            else
            {
                if (!player.Object.CurrentMap.ContainsPosition(new Vector3(e.PositionX, 0, e.PositionZ)))
                {
                    this._logger.LogError($"Cannot teleport. Destination position is out of map bounds.");
                    return;
                }

                // TODO: get map height at x/z position
                float positionY = e.PositionY ?? 100;
                player.Object.Position           = new Vector3(e.PositionX, positionY, e.PositionZ);
                player.Moves.DestinationPosition = player.Object.Position.Clone();
            }

            WorldPacketFactory.SendPlayerTeleport(player);
        }
コード例 #8
0
        /// <inheritdoc />
        public void ResurectLodelight(IPlayerEntity player)
        {
            IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position);

            if (revivalRegion == null)
            {
                _logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'.");
                return;
            }

            decimal recoveryRate = _gameResources.Penalities.GetRevivalPenality(player.Object.Level) / 100;
            var     jobData      = player.PlayerData.JobData;

            int strength     = player.Attributes[DefineAttributes.STR];
            int stamina      = player.Attributes[DefineAttributes.STA];
            int dexterity    = player.Attributes[DefineAttributes.DEX];
            int intelligence = player.Attributes[DefineAttributes.INT];

            player.Attributes[DefineAttributes.HP] = (int)(HealthFormulas.GetMaxOriginHp(player.Object.Level, stamina, jobData.MaxHpFactor) * recoveryRate);
            player.Attributes[DefineAttributes.MP] = (int)(HealthFormulas.GetMaxOriginMp(player.Object.Level, intelligence, jobData.MaxMpFactor, true) * recoveryRate);
            player.Attributes[DefineAttributes.FP] = (int)(HealthFormulas.GetMaxOriginFp(player.Object.Level, stamina, dexterity, strength, jobData.MaxFpFactor, true) * recoveryRate);

            if (player.Object.MapId != revivalRegion.MapId)
            {
                IMapInstance revivalMap = _mapManager.GetMap(revivalRegion.MapId);

                if (revivalMap == null)
                {
                    _logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'.");
                    // TODO: disconnect client
                    //player.Connection.Server.DisconnectClient(player.Connection.Id);
                    return;
                }

                revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key);
            }

            _teleportSystem.Teleport(player, revivalRegion.MapId, revivalRegion.RevivalPosition.X, null, revivalRegion.RevivalPosition.Z);

            _moverPacketFactory.SendMotion(player, ObjectMessageType.OBJMSG_ACC_STOP | ObjectMessageType.OBJMSG_STOP_TURN | ObjectMessageType.OBJMSG_STAND);
            _playerPacketFactory.SendPlayerRevival(player);
            _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.HP, player.Attributes[DefineAttributes.HP]);
            _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.MP, player.Attributes[DefineAttributes.MP]);
            _moverPacketFactory.SendUpdateAttributes(player, DefineAttributes.FP, player.Attributes[DefineAttributes.FP]);

            ProcessDeathPenality(player);
        }
コード例 #9
0
ファイル: WorldClient.cs プロジェクト: Oshimada/Rhisis
        /// <summary>
        /// Despawns the current player and notify other players arround.
        /// </summary>
        /// <param name="currentMap"></param>
        private void DespawnPlayer(IMapInstance currentMap)
        {
            IEnumerable <IEntity> entitiesAround = from x in currentMap.Entities
                                                   where this.Player.Object.Position.IsInCircle(x.Object.Position, VisibilitySystem.VisibilityRange) && x != this.Player
                                                   select x;

            this.Player.Object.Spawned = false;

            foreach (IEntity entity in entitiesAround)
            {
                if (entity.Type == WorldEntityType.Player)
                {
                    WorldPacketFactory.SendDespawnObjectTo(entity as IPlayerEntity, this.Player);
                }

                entity.Object.Entities.Remove(this.Player);
            }

            currentMap.DeleteEntity(this.Player);
        }
コード例 #10
0
        public static void TeleportCommandThreeParam(IPlayerEntity player, string[] parameters)
        {
            if (!ushort.TryParse(parameters[0], out ushort mapIdValue) || !float.TryParse(parameters[1], out float posXValue) ||
                !float.TryParse(parameters[2], out float posZValue))
            {
                throw new ArgumentException("You must write numbers for teleport command's parameters");
            }

            IMapInstance mapIdResult = Maps[mapIdValue];

            if (mapIdResult == null)
            {
                Logger.Error($"Cannot find map Id in define files: {mapIdResult}. Please check you defineWorld.h file.");
                return;
            }

            player.Object.MapId      = mapIdValue;
            player.Object.Position.X = posXValue;
            player.Object.Position.Z = posZValue;
        }
コード例 #11
0
ファイル: MapManager.cs プロジェクト: zero16832/Rhisis
        /// <inheritdoc />
        public void Load()
        {
            string worldScriptPath = GameResourcesConstants.Paths.WorldScriptPath;
            var    worldsPaths     = new Dictionary <string, string>();

            using (var textFile = new TextFile(worldScriptPath))
            {
                foreach (var text in textFile.Texts)
                {
                    worldsPaths.Add(text.Key, text.Value.Replace('"', ' ').Trim());
                }
            }

            foreach (string mapDefineName in _worldConfiguration.Maps)
            {
                if (!worldsPaths.TryGetValue(mapDefineName, out string mapName))
                {
                    _logger.LogWarning(GameResourcesConstants.Errors.UnableLoadMapMessage, mapDefineName, $"map is not declared inside '{worldScriptPath}' file");
                    continue;
                }

                if (!_gameResources.Defines.TryGetValue(mapDefineName, out int mapId))
                {
                    _logger.LogWarning(GameResourcesConstants.Errors.UnableLoadMapMessage, mapDefineName, $"map has no define id inside '{GameResourcesConstants.Paths.DataSub0Path}/defineWorld.h' file");
                    continue;
                }

                if (_maps.ContainsKey(mapId))
                {
                    _logger.LogWarning(GameResourcesConstants.Errors.UnableLoadMapMessage, mapDefineName, $"another map with id '{mapId}' already exist.");
                    continue;
                }

                IMapInstance map = _mapFactory.Create(Path.Combine(GameResourcesConstants.Paths.MapsPath, mapName), mapName, mapId);

                _maps.Add(mapId, map);
            }

            _logger.LogInformation("-> {0} maps loaded.", _maps.Count);
        }
コード例 #12
0
        /// <inheritdoc />
        public IItemEntity CreateItemEntity(IMapInstance currentMapContext, IMapLayer currentMapLayerContext, ItemDescriptor item, IWorldEntity owner = null)
        {
            var itemEntity = _itemEntityFactory(_serviceProvider, null) as IItemEntity;

            itemEntity.Object = new ObjectComponent
            {
                CurrentMap = currentMapContext,
                MapId      = currentMapContext.Id,
                LayerId    = currentMapLayerContext.Id,
                ModelId    = item.Id,
                Name       = item.Data.Name,
                Spawned    = true,
                Type       = WorldObjectType.Item
            };

            itemEntity.Drop = new DropComponent
            {
                Owner = owner,
                Item  = CreateItem(item.Id, item.Refine, item.Element, item.ElementRefine)
            };

            return(itemEntity);
        }
コード例 #13
0
        /// <inheritdoc />
        public void Execute(IPlayerEntity player, object[] parameters)
        {
            if (parameters.Length <= 0 || parameters.Length > 2)
            {
                throw new ArgumentException($"Create monster command must have 1 or 2 parameters.", nameof(parameters));
            }

            if (!int.TryParse((string)parameters[0], out int monsterId))
            {
                throw new ArgumentException($"Cannot convert the first parameter in int.", nameof(parameters));
            }

            int quantityToSpawn = 1;

            if (parameters.Length == 2)
            {
                if (!int.TryParse((string)parameters[1], out quantityToSpawn))
                {
                    throw new ArgumentException($"Cannot convert the second parameter in int.", nameof(parameters));
                }
            }
            _logger.LogTrace($"{player.Object.Name} want to spawn {quantityToSpawn} mmonster");

            const int    sizeOfSpawnArea = 13;
            const int    respawnTime     = 65535;
            IMapInstance currentMap      = player.Object.CurrentMap;
            IMapLayer    currentMapLayer = currentMap.GetMapLayer(player.Object.LayerId);
            Vector3      currentPosition = player.Object.Position.Clone();
            var          respawnRegion   = new MapRespawnRegion((int)currentPosition.X - sizeOfSpawnArea / 2, (int)currentPosition.Z - sizeOfSpawnArea / 2, sizeOfSpawnArea, sizeOfSpawnArea, respawnTime, WorldObjectType.Mover, monsterId, quantityToSpawn);

            for (int i = 0; i < quantityToSpawn; i++)
            {
                IMonsterEntity monsterToCreate = _monsterFactory.CreateMonster(currentMap, currentMapLayer, monsterId, respawnRegion, true);
                monsterToCreate.Object.Position = player.Object.Position.Clone();
                currentMapLayer.AddEntity(monsterToCreate);
            }
        }
コード例 #14
0
ファイル: JoinGameHandler.cs プロジェクト: Oshimada/Rhisis
        public static void OnJoin(WorldClient client, INetPacketStream packet)
        {
            var         joinPacket = new JoinPacket(packet);
            DbCharacter character  = null;

            using (var database = DependencyContainer.Instance.Resolve <IDatabase>())
                character = database.Characters.Get(joinPacket.PlayerId);

            if (character == null)
            {
                Logger.Error($"Invalid player id received from client; cannot find player with id: {joinPacket.PlayerId}");
                return;
            }

            if (character.IsDeleted)
            {
                Logger.Warn($"Cannot connect with character '{character.Name}' for user '{character.User.Username}'. Reason: character is deleted.");
                return;
            }

            if (character.User.Authority <= 0)
            {
                Logger.Info($"User {character.User.Username} is banned.");
                // TODO: send error to client
                return;
            }

            IMapInstance map = DependencyContainer.Instance.Resolve <MapLoader>().GetMapById(character.MapId);

            if (map == null)
            {
                Logger.Warn("Map with id '{0}' doesn't exist.", character.MapId);
                // TODO: send error to client or go to default map ?
                return;
            }

            IMapLayer mapLayer = map.GetMapLayer(character.MapLayerId) ?? map.GetDefaultMapLayer();

            // 1st: Create the player entity with the map context
            client.Player = map.CreateEntity <PlayerEntity>();

            // 2nd: create and initialize the components
            client.Player.Object = new ObjectComponent
            {
                ModelId  = character.Gender == 0 ? 11 : 12,
                Type     = WorldObjectType.Mover,
                MapId    = character.MapId,
                LayerId  = mapLayer.Id,
                Position = new Vector3(character.PosX, character.PosY, character.PosZ),
                Angle    = character.Angle,
                Size     = 100,
                Name     = character.Name,
                Spawned  = false,
                Level    = character.Level
            };

            client.Player.Health = new HealthComponent
            {
                Hp = character.Hp,
                Mp = character.Mp,
                Fp = character.Fp
            };

            client.Player.VisualAppearance = new VisualAppearenceComponent
            {
                Gender    = character.Gender,
                SkinSetId = character.SkinSetId,
                HairId    = character.HairId,
                HairColor = character.HairColor,
                FaceId    = character.FaceId,
            };

            client.Player.PlayerData = new PlayerDataComponent
            {
                Id         = character.Id,
                Slot       = character.Slot,
                Gold       = character.Gold,
                Authority  = (AuthorityType)character.User.Authority,
                Experience = character.Experience,
                JobId      = character.ClassId
            };

            client.Player.MovableComponent = new MovableComponent
            {
                Speed = GameResources.Instance.Movers[client.Player.Object.ModelId].Speed,
                DestinationPosition = client.Player.Object.Position.Clone(),
                LastMoveTime        = Time.GetElapsedTime(),
                NextMoveTime        = Time.GetElapsedTime() + 10
            };

            client.Player.Statistics = new StatisticsComponent(character);

            var behaviors = DependencyContainer.Instance.Resolve <BehaviorLoader>();

            client.Player.Behavior   = behaviors.PlayerBehaviors.DefaultBehavior;
            client.Player.Connection = client;

            // Initialize the inventory
            var inventoryEventArgs = new InventoryInitializeEventArgs(character.Items);

            client.Player.NotifySystem <InventorySystem>(inventoryEventArgs);

            // Taskbar
            foreach (var applet in character.TaskbarShortcuts.Where(x => x.TargetTaskbar == ShortcutTaskbarTarget.Applet))
            {
                if (applet.Type == ShortcutType.Item)
                {
                    var item = client.Player.Inventory.GetItem(x => x.Slot == applet.ObjectId);
                    client.Player.Taskbar.Applets.CreateShortcut(new Shortcut(applet.SlotIndex, applet.Type, (uint)item.UniqueId, applet.ObjectType, applet.ObjectIndex, applet.UserId, applet.ObjectData, applet.Text));
                }
                else
                {
                    client.Player.Taskbar.Applets.CreateShortcut(new Shortcut(applet.SlotIndex, applet.Type, applet.ObjectId, applet.ObjectType, applet.ObjectIndex, applet.UserId, applet.ObjectData, applet.Text));
                }
            }

            foreach (var item in character.TaskbarShortcuts.Where(x => x.TargetTaskbar == ShortcutTaskbarTarget.Item))
            {
                if (item.Type == ShortcutType.Item)
                {
                    var inventoryItem = client.Player.Inventory.GetItem(x => x.Slot == item.ObjectId);
                    client.Player.Taskbar.Items.CreateShortcut(new Shortcut(item.SlotIndex, item.Type, (uint)inventoryItem.UniqueId, item.ObjectType, item.ObjectIndex, item.UserId, item.ObjectData, item.Text), item.SlotLevelIndex.HasValue ? item.SlotLevelIndex.Value : -1);
                }
                else
                {
                    client.Player.Taskbar.Items.CreateShortcut(new Shortcut(item.SlotIndex, item.Type, item.ObjectId, item.ObjectType, item.ObjectIndex, item.UserId, item.ObjectData, item.Text), item.SlotLevelIndex.HasValue ? item.SlotLevelIndex.Value : -1);
                }
            }

            TestCommand.OnTest(client.Player, new string[] { });

            var list = new List <Shortcut>();

            foreach (var skill in character.TaskbarShortcuts.Where(x => x.TargetTaskbar == ShortcutTaskbarTarget.Queue))
            {
                list.Add(new Shortcut(skill.SlotIndex, skill.Type, skill.ObjectId, skill.ObjectType, skill.ObjectIndex, skill.UserId, skill.ObjectData, skill.Text));
            }
            client.Player.Taskbar.Queue.CreateShortcuts(list);

            // 3rd: spawn the player
            WorldPacketFactory.SendPlayerSpawn(client.Player);

            // 4th: player is now spawned
            client.Player.Object.Spawned = true;
            client.LoggedInAt            = DateTime.UtcNow;
        }
コード例 #15
0
ファイル: ItemFactoryMock.cs プロジェクト: zero16832/Rhisis
 public IItemEntity CreateItemEntity(IMapInstance currentMapContext, IMapLayer currentMapLayerContext, ItemDescriptor item, IWorldEntity owner = null)
 {
     throw new NotImplementedException();
 }
コード例 #16
0
 /// <summary>
 /// Creates a new <see cref="MapLayer"/> instance.
 /// </summary>
 /// <param name="parentMapInstance">Parent map.</param>
 /// <param name="layerId">Layer id.</param>
 /// <param name="visibilitySystem">Visibility system.qvisual</param>
 public MapLayer(IMapInstance parentMapInstance, int layerId, IVisibilitySystem visibilitySystem)
 {
     Id                = layerId;
     ParentMap         = parentMapInstance;
     _visibilitySystem = visibilitySystem;
 }
コード例 #17
0
        public void UseBlinkwingItem(IPlayerEntity player, Item blinkwing)
        {
            if (player.Object.Level < blinkwing.Data.LimitLevel)
            {
                _logger.LogError($"Player {player.Object.Name} cannot use {blinkwing.Data.Name}. Level too low.");
                _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_USINGNOTLEVEL);
                return;
            }

            // TODO: Check if player is sit
            // TODO: Check if player is on Kebaras island
            // TODO: Check if player is in guild war map

            TeleportEventArgs teleportEvent;

            if (blinkwing.Data.ItemKind3 == ItemKind3.TOWNBLINKWING)
            {
                IMapRevivalRegion revivalRegion = player.Object.CurrentMap.GetNearRevivalRegion(player.Object.Position);

                if (revivalRegion == null)
                {
                    _logger.LogError($"Cannot find any revival region for map '{player.Object.CurrentMap.Name}'.");
                    return;
                }
                if (player.Object.MapId != revivalRegion.MapId)
                {
                    IMapInstance revivalMap = _mapManager.GetMap(revivalRegion.MapId);

                    if (revivalMap == null)
                    {
                        _logger.LogError($"Cannot find revival map with id '{revivalRegion.MapId}'.");
                        // TODO: disconnect client
                        //player.Connection.Server.DisconnectClient(player.Connection.Id);
                        return;
                    }

                    revivalRegion = revivalMap.GetRevivalRegion(revivalRegion.Key);
                }

                teleportEvent = new TeleportEventArgs(revivalRegion.MapId,
                                                      revivalRegion.RevivalPosition.X,
                                                      revivalRegion.RevivalPosition.Z,
                                                      revivalRegion.RevivalPosition.Y);
            }
            else
            {
                teleportEvent = new TeleportEventArgs(blinkwing.Data.WeaponTypeId,   // Map Id
                                                      blinkwing.Data.ItemAtkOrder1,  // X
                                                      blinkwing.Data.ItemAtkOrder3,  // Z
                                                      blinkwing.Data.ItemAtkOrder2,  // Y
                                                      blinkwing.Data.ItemAtkOrder4); // Angle
            }

            player.Inventory.ItemInUseActionId = player.Delayer.DelayAction(TimeSpan.FromMilliseconds(blinkwing.Data.SkillReadyType), () =>
            {
                _teleportSystem.Teleport(player, teleportEvent.MapId, teleportEvent.PositionX, teleportEvent.PositionY, teleportEvent.PositionZ, teleportEvent.Angle);
                _specialEffectSystem.SetStateModeBaseMotion(player, StateModeBaseMotion.BASEMOTION_OFF);
                player.Inventory.ItemInUseActionId = Guid.Empty;
                DecreaseItem(player, blinkwing);
            });

            _specialEffectSystem.SetStateModeBaseMotion(player, StateModeBaseMotion.BASEMOTION_ON, blinkwing);
        }
コード例 #18
0
 public void Apply(IMapInstance instance)
 {
     instance.Access.Field();
 }
コード例 #19
0
        /// <inheritdoc />
        public IPlayerEntity CreatePlayer(DbCharacter character)
        {
            int playerModelId = character.Gender == 0 ? 11 : 12; // TODO: remove these magic numbers

            if (!_gameResources.Movers.TryGetValue(playerModelId, out MoverData moverData))
            {
                throw new ArgumentException($"Cannot find mover with id '{playerModelId}' in game resources.", nameof(playerModelId));
            }

            var player = _playerFactory(_serviceProvider, null) as PlayerEntity;

            IMapInstance map = _mapManager.GetMap(character.MapId);

            if (map == null)
            {
                throw new InvalidOperationException($"Cannot find map with id '{character.MapId}'.");
            }

            IMapLayer mapLayer = map.GetMapLayer(character.MapLayerId) ?? map.DefaultMapLayer;

            player.Object = new ObjectComponent
            {
                ModelId     = playerModelId,
                Type        = WorldObjectType.Mover,
                MapId       = character.MapId,
                CurrentMap  = map,
                LayerId     = mapLayer.Id,
                Position    = new Vector3(character.PosX, character.PosY, character.PosZ),
                Angle       = character.Angle,
                Size        = ObjectComponent.DefaultObjectSize,
                Name        = character.Name,
                Spawned     = false,
                Level       = character.Level,
                MovingFlags = ObjectState.OBJSTA_STAND
            };
            player.VisualAppearance = new VisualAppearenceComponent
            {
                Gender    = character.Gender,
                SkinSetId = character.SkinSetId,
                HairId    = character.HairId,
                HairColor = character.HairColor,
                FaceId    = character.FaceId,
            };
            player.PlayerData = new PlayerDataComponent
            {
                Id         = character.Id,
                Gender     = character.Gender.ToString().ToEnum <GenderType>(),
                Slot       = character.Slot,
                Gold       = character.Gold,
                Authority  = (AuthorityType)character.User.Authority,
                Experience = character.Experience,
                JobData    = _gameResources.Jobs[(DefineJob.Job)character.JobId]
            };
            player.Moves = new MovableComponent
            {
                Speed        = _gameResources.Movers[player.Object.ModelId]?.Speed ?? 0.1f,
                LastMoveTime = Time.GetElapsedTime(),
                NextMoveTime = Time.GetElapsedTime() + 10
            };

            player.Data = moverData;

            player.Attributes[DefineAttributes.HP]  = character.Hp;
            player.Attributes[DefineAttributes.MP]  = character.Mp;
            player.Attributes[DefineAttributes.FP]  = character.Fp;
            player.Attributes[DefineAttributes.STR] = character.Strength;
            player.Attributes[DefineAttributes.STA] = character.Stamina;
            player.Attributes[DefineAttributes.DEX] = character.Dexterity;
            player.Attributes[DefineAttributes.INT] = character.Intelligence;

            player.Statistics          = new StatisticsComponent(character);
            player.Timers.NextHealTime = Time.TimeInSeconds() + RecoverySystem.NextIdleHealStand;

            player.Behavior = _behaviorManager.GetDefaultBehavior(BehaviorType.Player, player);
            player.Hand     = _itemFactory.CreateItem(11, 0, ElementType.None, 0);

            var gameServices = _serviceProvider.GetRequiredService <IEnumerable <IGameSystemLifeCycle> >().OrderBy(x => x.Order);

            foreach (IGameSystemLifeCycle service in gameServices)
            {
                service.Initialize(player);
            }

            mapLayer.AddEntity(player);

            return(player);
        }