public override void Dispose() { ItmInterface.Stop(); CbtInterface.Stop(); StsInterface.Stop(); QtsInterface.Stop(); MvtInterface.Stop(); AbtInterface.Stop(); EvtInterface.Stop(); AiInterface.Stop(); base.Dispose(); }
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); } }
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()); } }
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); } }
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); }
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(); } } } }
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); }
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(); }
// 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); }
/// <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); }