/// <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); } } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); } }
/// <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); }
/// <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); }
/// <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); }
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; }
/// <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); }
/// <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); }
/// <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); } }
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; }
public IItemEntity CreateItemEntity(IMapInstance currentMapContext, IMapLayer currentMapLayerContext, ItemDescriptor item, IWorldEntity owner = null) { throw new NotImplementedException(); }
/// <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; }
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); }
public void Apply(IMapInstance instance) { instance.Access.Field(); }
/// <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); }