コード例 #1
0
        public override void Dispose()
        {
            ItmInterface.Stop();
            CbtInterface.Stop();
            StsInterface.Stop();
            QtsInterface.Stop();
            MvtInterface.Stop();
            AbtInterface.Stop();
            EvtInterface.Stop();
            AiInterface.Stop();

            base.Dispose();
        }
コード例 #2
0
        public virtual void SendMovementState(Player player, ushort targetX, ushort targetY, ushort targetZ, bool isRun)
        {
            PacketOut Out = new PacketOut((byte)Opcodes.F_OBJECT_STATE, 28);

            Out.WriteUInt16(Oid);
            Out.WriteUInt16((ushort)X);
            Out.WriteUInt16((ushort)Y);
            Out.WriteUInt16((ushort)Z);
            Out.WriteByte(PctHealth);
            // Possibly flags:
            // 1: Destination position update (Rotation update if 0)
            // 2: Look-at target
            // 16: States
            // 32: No Gravity
            // 40: Recall state
            byte flags = 1;

            if (CbtInterface.GetCurrentTarget() != null)
            {
                flags |= 2;
            }
            Out.WriteByte(flags);
            Out.WriteByte((byte)Zone.ZoneId);
            Out.WriteByte(0);   // Unk1
            Out.WriteUInt32(0); // Unk2

            /*if (isRun)
             *  Out.WriteUInt16R(0xEB);
             * else
             *  Out.WriteUInt16R(0x55);*/
            Out.WriteUInt16R((ushort)(Speed * 2.35f));

            Out.WriteByte(0); // DestUnk
            Out.WriteUInt16R(targetX);
            Out.WriteUInt16R(targetY);
            Out.WriteUInt16R(targetZ);
            Out.WriteByte((byte)Zone.ZoneId);
            if ((flags & 2) == 2)
            {
                Out.WriteUInt16R(CbtInterface.GetCurrentTarget()?.Oid ?? 0);
            }

            if (player == null)
            {
                DispatchPacket(Out, false);
            }
            else
            {
                player.SendPacket(Out);
            }
        }
コード例 #3
0
ファイル: Player.cs プロジェクト: uvbs/DoR
        public void Quit(bool CloseClient)
        {
            try
            {
                if (IsMoving)
                {
                    SendLocalizeString("", GameData.Localized_text.TEXT_MUST_NOT_MOVE_TO_QUIT);
                    return;
                }

                if (CbtInterface.IsFighting())
                {
                    SendLocalizeString("", GameData.Localized_text.TEXT_CANT_QUIT_IN_COMBAT);
                    return;
                }

                if (AbtInterface.IsCasting())
                {
                    SendLocalizeString("", GameData.Localized_text.TEXT_CANT_QUIT_YOURE_CASTING);
                    return;
                }

                if (IsDead)
                {
                    SendLocalizeString("", GameData.Localized_text.TEXT_CANT_QUIT_YOURE_DEAD);
                    return;
                }

                if (DisconnectTime >= DISCONNECT_TIME)
                {
                    EvtInterface.AddEvent(Quit, 5000, 5);
                }

                Leaving = true;

                SendLocalizeString("" + DisconnectTime / 1000, GameData.Localized_text.TEXT_YOU_WILL_LOG_OUT_IN_X_SECONDS);
                DisconnectTime  -= 5000;
                this.CloseClient = CloseClient;

                if (!IsDisposed && (DisconnectTime < 0 || GmLevel >= 1))  // Leave
                {
                    Dispose();
                }
            }
            catch (Exception e)
            {
                Log.Error("Quit", e.ToString());
            }
        }
コード例 #4
0
 public void AttemptClear()
 {
     foreach (NPCAbility ab in AbtInterface.NPCAbilities)
     {
         PacketOut Out = new PacketOut((byte)Opcodes.F_PET_INFO, 12);
         Out.WriteUInt16(Oid);
         Out.WriteUInt16(CbtInterface.GetTarget(TargetTypes.TARGETTYPES_TARGET_ENEMY)?.Oid ?? 0); // Pet target?
         Out.WriteUInt16(ab.Entry);
         Out.WriteByte(FollowMode);                                                               // 1 stay 2= heel
         Out.WriteByte(AIMode);                                                                   // 3 passive // 4 guard // 5 Aggressive
         Out.WriteByte((byte)PetUpdateType.RemoveAbility);
         Out.WriteByte(0);
         Out.WriteByte(0);
         Owner.SendPacket(Out);
     }
 }
コード例 #5
0
        public void SendPetUpdate()
        {
            if (!_ownerUILinked || Owner == null)
            {
                return;
            }

            PacketOut Out = new PacketOut((byte)Opcodes.F_PET_INFO, 12);

            Out.WriteUInt16(Oid);
            Out.WriteUInt16(CbtInterface.GetTarget(TargetTypes.TARGETTYPES_TARGET_ENEMY)?.Oid ?? 0);
            Out.WriteUInt16(0);
            Out.WriteByte(FollowMode);
            Out.WriteByte(AIMode);
            Out.WriteByte((byte)PetUpdateType.Update);
            Out.WriteByte(0);
            Out.WriteByte(0);
            Owner.SendPacket(Out);
        }
コード例 #6
0
ファイル: Player.cs プロジェクト: uvbs/DoR
        public override void OnRangeUpdate()
        {
            if (CurrentPiece == null || !CurrentPiece.IsOn((ushort)(X / 64), (ushort)(Y / 64), Zone.ZoneId))
            {
                CurrentPiece = Zone.ClientInfo.GetWorldPiece((ushort)X, (ushort)Y, Zone.ZoneId);
                if (CurrentPiece != null)
                {
                    if (CurrentPiece.Area != null)
                    {
                        TokInterface.AddTok(CurrentPiece.Area.TokExploreEntry);
                    }

                    if (CurrentPiece.IsPvp((byte)Realm))
                    {
                        CbtInterface.EnablePvp();
                    }
                }
            }
        }
コード例 #7
0
        public void SendPetInitial()
        {
            if (!_ownerUILinked || Owner == null)
            {
                return;
            }

            PacketOut Out = new PacketOut((byte)Opcodes.F_PET_INFO, 12);

            Out.WriteUInt16(Oid);
            Out.WriteUInt16(CbtInterface.GetTarget(TargetTypes.TARGETTYPES_TARGET_ENEMY)?.Oid ?? 0); // Pet target?
            Out.WriteUInt16((ushort)AbtInterface.NPCAbilities.Count);
            Out.WriteByte(FollowMode);
            Out.WriteByte(AIMode);
            Out.WriteByte((byte)PetUpdateType.Initialize);
            foreach (NPCAbility ab in AbtInterface.NPCAbilities)
            {
                Out.WriteUInt16(ab.Entry);
                Out.WriteByte(ab.AutoUse ? (byte)1 : (byte)0);
            }
            Out.WriteByte(0);
            Out.WriteByte(0);
            Owner.SendPacket(Out);
        }
コード例 #8
0
        public override void Update()
        {
            long Tick = TCPManager.GetTimeStampMS();

            UpdateHealth(Tick);
            UpdateActionPoints(Tick);
            EvtInterface.Update(Tick);

            CbtInterface.Update(Tick);
            ItmInterface.Update(Tick);
            StsInterface.Update(Tick);
            QtsInterface.Update(Tick);
            MvtInterface.Update(Tick);
            AbtInterface.Update(Tick);
            AiInterface.Update(Tick);

            if (NextSend < Tick)
            {
                NextSend = Tick + STATE_INTERVAL;
                SendState(null);
            }

            base.Update();
        }
コード例 #9
0
        // RB   5/21/2016   Damage Resistance for siege
        /// <summary>Inflicts damage upon this unit.</summary>
        public override bool ReceiveDamage(Unit caster, uint damage, float hatredScale = 1f, uint mitigation = 0)
        {
            bool   wasKilled      = false;
            Player creditedPlayer = null;

            if (IsDead || PendingDisposal || IsInvulnerable)
            {
                return(false);
            }

            if (caster.Realm != Realm)
            {
                creditedPlayer = caster.CbtInterface.CreditedPlayer;
            }

            lock (DamageApplicationLock)
            {
                if (IsDead)
                {
                    return(false);
                }
                if (damage >= Health)
                {
                    wasKilled = true;

                    damage  = Health;
                    _health = 0;

                    if (creditedPlayer != null)
                    {
                        PendingTotalDamageTaken += damage;
                        AddTrackedDamage(creditedPlayer, damage);
                    }

                    TotalDamageTaken        = PendingTotalDamageTaken;
                    PendingTotalDamageTaken = 0;
                }
                else
                {
                    _health = Math.Max(0, _health - damage);

                    if (creditedPlayer != null)
                    {
                        PendingTotalDamageTaken += damage;
                        AddTrackedDamage(creditedPlayer, damage);
                    }
                }
            }

            CbtInterface.OnTakeDamage(caster, damage, 1f);
            Siege siege = caster as Siege;

            if (siege != null)
            {
                Siege s = siege;
                foreach (KeyValuePair <Player, byte> p in s.SiegeInterface.Players)
                {
                    p.Key.CbtInterface.OnDealDamage(this, damage);
                }
            }
            else
            {
                caster.CbtInterface.OnDealDamage(this, damage);
            }

            LastHitOid = caster.Oid;

            if (wasKilled)
            {
                SetDeath(caster);
            }

            return(wasKilled);
        }
コード例 #10
0
ファイル: KeepDoor.cs プロジェクト: cooler-SAI/ProjectWAR
            /// <summary>Inflicts damage upon this unit and returns whether lethal damage was dealt.</summary>
            public override bool ReceiveDamage(Unit caster, uint damage, float hatredScale = 1f, uint mitigation = 0)
            {
                // RB   6/8/2016    Posterns shouldn't be dealt damage.
                if (_keepDoor != null && _keepDoor.Info.Number != (int)KeepDoorType.InnerMain && _keepDoor.Info.Number != (int)KeepDoorType.OuterMain)
                {
                    return(false);
                }

                bool wasKilled = false;

                if (IsDead || PendingDisposal || IsInvulnerable)
                {
                    return(false);
                }

                lock (DamageApplicationLock)
                {
                    if (IsDead)
                    {
                        return(false);
                    }
                    if (damage >= Health)
                    {
                        wasKilled = true;

                        damage  = Health;
                        _health = 0;

                        TotalDamageTaken        = PendingTotalDamageTaken;
                        PendingTotalDamageTaken = 0;
                    }
                    else
                    {
                        _health = Math.Max(0, _health - damage);
                    }
                }

                _keep.KeepCommunications.SendKeepStatus(null, _keep);

                CbtInterface.OnTakeDamage(caster, damage, 1f);

                Siege siege = caster as Siege;

                if (siege != null)
                {
                    foreach (KeyValuePair <Player, byte> p in siege.SiegeInterface.Players)
                    {
                        p.Key.CbtInterface.OnDealDamage(this, damage);
                    }
                }
                else
                {
                    caster.CbtInterface.OnDealDamage(this, damage);
                }

                LastHitOid = caster.Oid;

                if (wasKilled)
                {
                    SetDeath(caster);
                }

                return(wasKilled);
            }