示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
            }
        }
示例#3
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);
        }
示例#4
0
        /// <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.");
            }
        }
示例#5
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);
        }