示例#1
0
 public void Destroy(bool immediate)
 {
     if (!immediate)
     {
         RealmManager.AddPendingAction(_ => Destroy(true), PendingPriority.Destruction);
     }
     if (Owner != null)
     {
         //ProjectileOwner.Projectiles[ProjectileId] = null;
         Owner.LeaveWorld(this);
     }
 }
示例#2
0
 void DisconnectFromRealm()
 {
     RealmManager.AddPendingAction(t =>
     {
         if (Player != null)
         {
             Player.SaveToCharacter();
         }
         Save();
         RealmManager.Disconnect(this);
     }, PendingPriority.Destruction);
 }
示例#3
0
 public void Reconnect(ReconnectPacket pkt)
 {
     RealmManager.AddPendingAction(t =>
     {
         if (Player != null)
         {
             Player.SaveToCharacter();
         }
         Save();
         RealmManager.Disconnect(this);
         SendPacket(pkt);
     }, PendingPriority.Destruction);
 }
示例#4
0
        void PoisonEnemy(Enemy enemy, ActivateEffect eff)
        {
            int        remainingDmg = (int)StatsManager.GetDefenseDamage(enemy, eff.TotalDamage, enemy.ObjectDesc.Defense);
            int        perDmg       = (int)(remainingDmg * 1000 / eff.DurationMS);
            WorldTimer tmr          = null;
            int        x            = 0;

            tmr = new WorldTimer(100, (w, t) =>
            {
                if (enemy.Owner == null)
                {
                    return;
                }
                w.BroadcastPacket(new ShowEffectPacket()
                {
                    EffectType = EffectType.Dead,
                    TargetId   = enemy.Id,
                    Color      = new ARGB(0xffddff00)
                }, null);

                if (x % 10 == 0)
                {
                    int thisDmg;
                    if (remainingDmg < perDmg)
                    {
                        thisDmg = remainingDmg;
                    }
                    else
                    {
                        thisDmg = perDmg;
                    }

                    enemy.Damage(this, t, thisDmg, true);
                    remainingDmg -= thisDmg;
                    if (remainingDmg <= 0)
                    {
                        return;
                    }
                }
                x++;

                tmr.Reset();

                RealmManager.AddPendingAction(_ => w.Timers.Add(tmr), PendingPriority.Creation);
            });
            Owner.Timers.Add(tmr);
        }
示例#5
0
 void ReceivePacket(Packet pkt)
 {
     if (stage == ProtocalStage.Disconnected)
     {
         return;
     }
     if (stage == ProtocalStage.Ready && (entity == null || entity != null && entity.Owner == null))
     {
         return;
     }
     Packet.BeginReadPacket(skt, this, ReceivePacket, Disconnect);
     try
     {
         if (pkt.ID == PacketID.Hello)
         {
             ProcessHelloPacket(pkt as HelloPacket);
         }
         else if (pkt.ID == PacketID.Create)
         {
             ProcessCreatePacket(pkt as CreatePacket);
         }
         else if (pkt.ID == PacketID.Load)
         {
             ProcessLoadPacket(pkt as LoadPacket);
         }
         else if (pkt.ID == PacketID.Pong)
         {
             entity.Pong(pkt as PongPacket);
         }
         else if (pkt.ID == PacketID.Move)
         {
             RealmManager.AddPendingAction(t => entity.Move(t, pkt as MovePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.PlayerShoot)
         {
             RealmManager.AddPendingAction(t => entity.PlayerShoot(t, pkt as PlayerShootPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.EnemyHit)
         {
             RealmManager.AddPendingAction(t => entity.EnemyHit(t, pkt as EnemyHitPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.OtherHit)
         {
             RealmManager.AddPendingAction(t => entity.OtherHit(t, pkt as OtherHitPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.SquareHit)
         {
             RealmManager.AddPendingAction(t => entity.SquareHit(t, pkt as SquareHitPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.PlayerHit)
         {
             RealmManager.AddPendingAction(t => entity.PlayerHit(t, pkt as PlayerHitPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.ShootAck)
         {
             RealmManager.AddPendingAction(t => entity.ShootAck(t, pkt as ShootAckPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.InvSwap)
         {
             RealmManager.AddPendingAction(t => entity.InventorySwap(t, pkt as InvSwapPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.InvDrop)
         {
             RealmManager.AddPendingAction(t => entity.InventoryDrop(t, pkt as InvDropPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.UseItem)
         {
             RealmManager.AddPendingAction(t => entity.UseItem(t, pkt as UseItemPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.UsePortal)
         {
             RealmManager.AddPendingAction(t => entity.UsePortal(t, pkt as UsePortalPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.PlayerText)
         {
             RealmManager.AddPendingAction(t => entity.PlayerText(t, pkt as PlayerTextPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.ChooseName)
         {
             RealmManager.AddPendingAction(t => ProcessChooseNamePacket(pkt as ChooseNamePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.Escape)
         {
             RealmManager.AddPendingAction(t => ProcessEscapePacket(pkt as EscapePacket), PendingPriority.Emergent);
         }
         else if (pkt.ID == PacketID.Teleport)
         {
             RealmManager.AddPendingAction(t => entity.Teleport(t, pkt as TeleportPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.GotoAck)
         {
             RealmManager.AddPendingAction(t => entity.GotoAck(t, pkt as GotoAckPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.EditAccountList)
         {
             RealmManager.AddPendingAction(t => entity.EditAccountList(t, pkt as EditAccountListPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.Buy)
         {
             RealmManager.AddPendingAction(t => entity.Buy(t, pkt as BuyPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.RequestTrade)
         {
             RealmManager.AddPendingAction(t => entity.RequestTrade(t, pkt as RequestTradePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.ChangeTrade)
         {
             RealmManager.AddPendingAction(t => entity.ChangeTrade(t, pkt as ChangeTradePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.AcceptTrade)
         {
             RealmManager.AddPendingAction(t => entity.AcceptTrade(t, pkt as AcceptTradePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.CancelTrade)
         {
             RealmManager.AddPendingAction(t => entity.CancelTrade(t, pkt as CancelTradePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.AOEAck)
         {
             RealmManager.AddPendingAction(t => entity.AOEAck(t, pkt as AOEAckPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.GroundDamage)
         {
             RealmManager.AddPendingAction(t => entity.GroundDamage(t, pkt as GroundDamagePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.CheckCredits)
         {
             RealmManager.AddPendingAction(t => entity.CheckCredits(t, pkt as CheckCreditsPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.CreateGuild)
         {
             RealmManager.AddPendingAction(t => entity.CreateGuild(pkt as CreateGuildPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.JoinGuild)
         {
             RealmManager.AddPendingAction(t => entity.JoinGuild(pkt as JoinGuildPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.GuildInvite)
         {
             RealmManager.AddPendingAction(t => entity.InviteToGuild(pkt as InviteToGuildPacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.ChangeGuildRank)
         {
             RealmManager.AddPendingAction(t => entity.ChangeRank(pkt as GuildRankChangePacket), PendingPriority.Networking);
         }
         else if (pkt.ID == PacketID.GuildRemove)
         {
             RealmManager.AddPendingAction(t => entity.RemoveFromGuild(pkt as GuildRemovePacket), PendingPriority.Networking);
         }
         else if (pkt.ID != PacketID.Packet)
         {
             Console.WriteLine("Unhandled packet: " + pkt.ToString());
         }
         else
         {
             Console.WriteLine((int)pkt.ID);
         }
     }
     catch
     {
         Disconnect();
     }
 }