private bool IsWarpLegit(Player player, EnterGate enterGate) { if (enterGate == null) { return(false); } if (player.SelectedCharacter == null) { return(false); } if (enterGate.LevelRequirement > player.Attributes[Stats.Level]) { player.PlayerView.ShowMessage("Your level is too low to enter this map.", MessageType.BlueNormal); return(false); } var currentPosition = player.IsWalking ? player.WalkTarget : player.Position; var inaccuracy = player.GameContext.Configuration.InfoRange; if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) && !(this.IsXInRange(currentPosition, enterGate, inaccuracy) && this.IsYInRange(currentPosition, enterGate, inaccuracy))) { return(false); } return(true); }
/// <summary> /// Enters the gate. /// </summary> /// <param name="player">The player.</param> /// <param name="enterGate">The enter gate.</param> public void EnterGate(Player player, EnterGate enterGate) { if (enterGate == null) { return; } if (player.SelectedCharacter == null) { return; } if (enterGate.LevelRequirement > player.Attributes[Stats.Level]) { player.PlayerView.ShowMessage("Your level is too low to enter this map.", Interfaces.MessageType.BlueNormal); return; } if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) && !(player.X >= enterGate.X1 - INACCURACY && player.X <= enterGate.X2 + INACCURACY && player.Y >= enterGate.Y1 - INACCURACY && player.Y <= enterGate.Y2 + INACCURACY)) { return; } player.WarpTo(enterGate.TargetGate); }
/// <inheritdoc/> public void HandlePacket(Player player, Span <byte> packet) { if (packet.Length < EnterGateRequest.Length) { return; } EnterGateRequest request = packet; var gateNumber = request.GateNumber; if (gateNumber == 0) { this.teleportAction.TryTeleportWithSkill(player, new Point(request.TeleportTargetX, request.TeleportTargetY)); return; } EnterGate gate = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => g.Number == gateNumber); if (gate is null) { player.Logger.LogWarning("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap); return; } this.warpAction.EnterGate(player, gate); }
/// <summary> /// Enters the gate. /// </summary> /// <param name="player">The player.</param> /// <param name="gate">The enter gate.</param> public void EnterGate(Player player, EnterGate gate) { if (this.IsWarpLegit(player, gate)) { player.WarpTo(gate.TargetGate); } else { player.ViewPlugIns.GetPlugIn <IMapChangePlugIn>()?.MapChangeFailed(); } }
/// <summary> /// Enters the gate. /// </summary> /// <param name="player">The player.</param> /// <param name="gate">The enter gate.</param> public void EnterGate(Player player, EnterGate gate) { if (this.IsWarpLegit(player, gate)) { player.WarpTo(gate.TargetGate); } else { // TODO: We need to send the correct response. // Currently, we just send the regular map change message, but this causes that the // player doesn't see objects in its range anymore. player.ViewPlugIns.GetPlugIn <IMapChangePlugIn>()?.MapChange(); } }
/// <inheritdoc/> public override void HandlePacket(Player player, byte[] packet) { if (packet.Length < 8) { return; } ushort gateNr = NumberConversionExtensions.MakeWord(packet[4], packet[3]); EnterGate gate = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => NumberConversionExtensions.ToUnsigned(g.Number) == gateNr); if (gate == null) { Logger.WarnFormat("Gate {0} not found in current map {1}", gateNr, player.SelectedCharacter.CurrentMap); return; } this.warpAction.EnterGate(player, gate); }
/// <inheritdoc/> public void HandlePacket(Player player, Span <byte> packet) { if (packet.Length < EnterGateRequest.Length) { return; } EnterGateRequest request = packet; var gateNumber = request.GateNumber; EnterGate gate = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => g.Number == gateNumber); if (gate == null) { player.Logger.LogWarning("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap); return; } this.warpAction.EnterGate(player, gate); }
/// <inheritdoc/> public void HandlePacket(Player player, Span <byte> packet) { if (packet.Length < 8) { return; } EnterGateRequest request = packet; var gateNumber = request.GateNumber; EnterGate gate = player.SelectedCharacter.CurrentMap.EnterGates.FirstOrDefault(g => NumberConversionExtensions.ToUnsigned(g.Number) == gateNumber); if (gate == null) { Logger.WarnFormat("Gate {0} not found in current map {1}", gateNumber, player.SelectedCharacter.CurrentMap); return; } this.warpAction.EnterGate(player, gate); }
private bool IsWarpLegit(Player player, EnterGate enterGate) { if (enterGate is null) { return(false); } if (player.SelectedCharacter is null) { return(false); } if (enterGate.LevelRequirement > player.Attributes[Stats.Level]) { player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage("Your level is too low to enter this map.", Interfaces.MessageType.BlueNormal); return(false); } if (enterGate.TargetGate.Map.TryGetRequirementError(player, out var errorMessage)) { player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage(errorMessage, Interfaces.MessageType.BlueNormal); return(false); } var currentPosition = player.IsWalking ? player.WalkTarget : player.Position; var inaccuracy = player.GameContext.Configuration.InfoRange; if (player.CurrentMap.Definition.EnterGates.Contains(enterGate) && !(this.IsXInRange(currentPosition, enterGate, inaccuracy) && this.IsYInRange(currentPosition, enterGate, inaccuracy))) { return(false); } return(true); }