public override void RunImpl()
        {
            L2Player player = _client.CurrentPlayer;

            if (player.TradeState != 0)
            {
                player.SendSystemMessage(SystemMessage.SystemMessageId.AlreadyTrading);
                player.SendActionFailed();
                return;
            }

            if (player.ObjId == _targetId)
            {
                player.SendSystemMessage(SystemMessage.SystemMessageId.CannotUseOnYourself);
                player.SendActionFailed();
                return;
            }

            if (player.EnchantState != 0)
            {
                player.SendActionFailed();
                return;
            }

            if (!(player.Target is L2Player))
            {
                player.SendSystemMessage(SystemMessage.SystemMessageId.TargetIsIncorrect);
                player.SendActionFailed();
                return;
            }

            L2Player target = (L2Player)player.Target;

            if (target.TradeState != 0)
            {
                player.SendPacket(new SystemMessage(SystemMessage.SystemMessageId.S1AlreadyTrading).AddPlayerName(target.Name));
                player.SendActionFailed();
                return;
            }

            if (target.PartyState == 1)
            {
                player.SendPacket(new SystemMessage(SystemMessage.SystemMessageId.S1IsBusyTryLater).AddPlayerName(target.Name));
                player.SendActionFailed();
                return;
            }

            if (!Calcs.CheckIfInRange(150, player, target, true))
            {
                player.SendActionFailed();
                return;
            }

            player.SendPacket(new SystemMessage(SystemMessage.SystemMessageId.RequestS1ForTrade).AddPlayerName(target.Name));
            target.Requester = player;
            player.Requester = target;
            target.SendPacket(new SendTradeRequest(player.ObjId));
            target.TradeState = 2; // жмакает ответ
            player.TradeState = 1; // запросил
        }
示例#2
0
        public override async Task RunImpl()
        {
            await Task.Run(() =>
            {
                L2Player player = _client.CurrentPlayer;

                if (player.TradeState != 2)
                {
                    player.SendMessageAsync("Stupid.");
                    _response = 0;
                }

                if (player.Requester == null)
                {
                    player.SendMessageAsync("Your trade requestor has logged off.");
                    player.SendActionFailedAsync();
                    player.TradeState = 0;
                    return;
                }

                if ((_response != 0) && (player.Requester.TradeState != 1))
                {
                    _response = 0;
                }

                if ((_response != 0) && (player.EnchantState != 0))
                {
                    _response = 0;
                }

                if ((_response != 0) && !Calcs.CheckIfInRange(150, player, player.Requester, true))
                {
                    _response = 0;
                }

                switch (_response)
                {
                case 0:
                    player.TradeState           = 0;
                    player.Requester.TradeState = 0;
                    player.Requester.SendPacketAsync(new SystemMessage(SystemMessageId.S1DeniedTradeRequest).AddPlayerName(player.Name));
                    player.Requester.Requester = null;
                    player.Requester           = null;
                    break;

                case 1:
                    player.Requester.SendPacketAsync(new SystemMessage(SystemMessageId.BeginTradeWithS1).AddPlayerName(player.Name));
                    player.SendPacketAsync(new SystemMessage(SystemMessageId.BeginTradeWithS1).AddPlayerName(player.Requester.Name));
                    player.TradeState           = 3;
                    player.Requester.TradeState = 3;
                    player.SendPacketAsync(new TradeStart(player));
                    player.Requester.SendPacketAsync(new TradeStart(player.Requester));
                    break;
                }
            });
        }
示例#3
0
        public virtual void DoAttack(L2Character target)
        {
            if (target == null)
            {
                return;
            }

            if (target.Dead)
            {
                return;
            }

            if ((AttackToHit != null) && AttackToHit.Enabled)
            {
                return;
            }

            if ((AttackToEnd != null) && AttackToEnd.Enabled)
            {
                return;
            }

            double dist  = 60,
                   reqMp = 0;

            L2Item weapon  = ActiveWeapon;
            double timeAtk = 100;//attackspeed
            bool   dual    = false,
                   ranged  = false,
                   ss      = false;

            if (weapon != null)
            {
            }
            else
            {
                timeAtk = (1362 * 345) / timeAtk;
            }

            if (!Calcs.CheckIfInRange((int)dist, this, target, true))
            {
                TryMoveTo(target.X, target.Y, target.Z);
                return;
            }

            if ((reqMp > 0) && (reqMp > CharStatus.CurrentMp))
            {
                SendMessage($"no mp {CharStatus.CurrentMp} {reqMp}");
                return;
            }

            Attack atk = new Attack(this, target, ss, 5);

            if (dual)
            {
                Hit1 = GenHitSimple(true, ss);
                atk.AddHit(target.ObjId, (int)Hit1.Damage, Hit1.Miss, Hit1.Crit, Hit1.ShieldDef > 0);

                Hit2 = GenHitSimple(true, ss);
                atk.AddHit(target.ObjId, (int)Hit2.Damage, Hit2.Miss, Hit2.Crit, Hit2.ShieldDef > 0);
            }
            else
            {
                Hit1 = GenHitSimple(false, ss);
                atk.AddHit(target.ObjId, (int)Hit1.Damage, Hit1.Miss, Hit1.Crit, Hit1.ShieldDef > 0);
            }

            Target = target;

            if (AttackToHit == null)
            {
                AttackToHit          = new Timer();
                AttackToHit.Elapsed += AttackDoHit;
            }

            double timeToHit = ranged ? timeAtk * 0.5 : timeAtk * 0.6;

            AttackToHit.Interval = timeToHit;
            AttackToHit.Enabled  = true;

            if (dual)
            {
                if (AttackToHitBonus == null)
                {
                    AttackToHitBonus          = new Timer();
                    AttackToHitBonus.Elapsed += AttackDoHit2Nd;
                }

                AttackToHitBonus.Interval = timeAtk * 0.78;
                AttackToHitBonus.Enabled  = true;
            }

            if (AttackToEnd == null)
            {
                AttackToEnd          = new Timer();
                AttackToEnd.Elapsed += AttackDoEnd;
            }

            AttackToEnd.Interval = timeAtk;
            AttackToEnd.Enabled  = true;

            BroadcastPacket(atk);
        }