/// <inheritdoc /> public void Execute(IPlayerEntity player, object[] parameters) { int destinationMapId = player.Object.MapId; var destinationPosition = new Vector3(); switch (parameters.Length) { case 2: destinationPosition.X = Convert.ToSingle(parameters[0]); destinationPosition.Z = Convert.ToSingle(parameters[1]); break; case 3: destinationMapId = Convert.ToInt32(parameters[0]); destinationPosition.X = Convert.ToSingle(parameters[1]); destinationPosition.Z = Convert.ToSingle(parameters[2]); break; case 4: destinationMapId = Convert.ToInt32(parameters[0]); destinationPosition.X = Convert.ToSingle(parameters[1]); destinationPosition.Y = Convert.ToSingle(parameters[2]); destinationPosition.Z = Convert.ToSingle(parameters[3]); break; default: throw new ArgumentException("Too many or not enough arguments."); } _teleportSystem.Teleport(player, destinationMapId, destinationPosition.X, destinationPosition.Y, destinationPosition.Z, player.Object.Angle); }
/// <inheritdoc /> public void CheckWrapzones(IPlayerEntity player) { var triggerRegion = player.Object.CurrentMap.Regions.FirstOrDefault(x => x is IMapTriggerRegion region && region.IsWrapzone && region.GetRectangle().Contains(player.Object.Position)) as IMapTriggerRegion; if (triggerRegion != null && triggerRegion.IsWrapzone) { _teleportSystem.Teleport(player, triggerRegion.DestinationMapId, triggerRegion.DestinationMapPosition.X, triggerRegion.DestinationMapPosition.Y, triggerRegion.DestinationMapPosition.Z); } }
/// <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); }
/// <inheritdoc /> public void Execute(IPlayerEntity player, object[] parameters) { if (parameters.Length == 1) { IPlayerEntity playerToSummon = _worldServer.GetPlayerEntity(parameters[0].ToString()); if (playerToSummon == null) { throw new ArgumentException($"The player doesn't exist or is not connected.", nameof(parameters)); } _teleportSystem.Teleport(playerToSummon, player.Object.MapId, player.Object.Position.X, player.Object.Position.Y, player.Object.Position.Z, player.Object.Angle); _logger.LogTrace($"{playerToSummon.Object.Name} is summoned by {player.Object.Name}."); } else { throw new ArgumentException("Too many or not enough arguments."); } }
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); }