/// <summary>
        /// Update monster moves.
        /// </summary>
        /// <param name="monster"></param>
        private void ProcessMonsterMovements(IMonsterEntity monster)
        {
            if (monster.Object.MovingFlags.HasFlag(ObjectState.OBJSTA_STAND))
            {
                if (monster.Timers.NextMoveTime < Time.TimeInSeconds())
                {
                    monster.Object.MovingFlags &= ~ObjectState.OBJSTA_STAND;
                    monster.Object.MovingFlags |= ObjectState.OBJSTA_FMOVE;
                    monster.Moves.DestinationPosition.Copy(monster.Region.GetRandomPosition());
                    monster.Object.Angle = Vector3.AngleBetween(monster.Object.Position, monster.Moves.DestinationPosition);

                    _moverPacketFactory.SendDestinationPosition(monster);
                    _moverPacketFactory.SendDestinationAngle(monster, false);
                }
                else if (monster.Moves.ReturningToOriginalPosition)
                {
                    monster.Attributes[DefineAttributes.HP] = monster.Data.AddHp;
                    _moverPacketFactory.SendUpdateAttributes(monster, DefineAttributes.HP, monster.Attributes[DefineAttributes.HP]);
                    monster.Moves.ReturningToOriginalPosition = false;
                }
                else if (monster.Moves.SpeedFactor >= 2f)
                {
                    monster.Moves.SpeedFactor = 1f;
                    _moverPacketFactory.SendSpeedFactor(monster, monster.Moves.SpeedFactor);
                }
            }
        }
Example #2
0
        public void OnSnapshotSetDestPosition(IWorldClient client, SetDestPositionPacket packet)
        {
            client.Player.Object.MovingFlags        = ObjectState.OBJSTA_FMOVE;
            client.Player.Moves.DestinationPosition = new Vector3(packet.X, packet.Y, packet.Z);
            client.Player.Follow.Reset();

            _moverPacketFactory.SendDestinationPosition(client.Player);
        }
Example #3
0
 /// <inheritdoc />
 public void Execute(IPlayerEntity player, object[] parameters)
 {
     if (player.PlayerData.Mode.HasFlag(ModeType.TRANSPARENT_MODE))
     {
         player.PlayerData.Mode &= ~ModeType.TRANSPARENT_MODE;
         _playerDataPacketFactory.SendModifyMode(player);
         _moverPacketFactory.SendDestinationPosition(player);
         _moverPacketFactory.SendMoverPositionAngle(player, sendOwnPlayer: false);
         _logger.LogTrace($"Player '{player.Object.Name}' is not anymore invisible.");
     }
     else
     {
         _logger.LogTrace($"Player '{player.Object.Name}' is currently not invisible.");
     }
 }
Example #4
0
        /// <summary>
        /// Spawn the other entity for the current entity.
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="otherEntity"></param>
        private void SpawnOtherEntity(IWorldEntity entity, IWorldEntity otherEntity)
        {
            entity.Object.Entities.Add(otherEntity);

            if (entity is IPlayerEntity player)
            {
                _worldSpawnPacketFactory.SendSpawnObjectTo(player, otherEntity);
            }

            if (otherEntity.Type != WorldEntityType.Player && !otherEntity.Object.Entities.Contains(entity))
            {
                otherEntity.Object.Entities.Add(entity);
            }

            if (otherEntity is IMovableEntity movableEntity &&
                movableEntity.Moves.DestinationPosition != movableEntity.Object.Position)
            {
                _moverPacketFactory.SendDestinationPosition(movableEntity);
            }
        }