Пример #1
0
 public void RemoveDrop(Drop Drop, RewardLeaveType Type = RewardLeaveType.Normal, int Option = 0)
 {
     if (Drops.Remove(Drop.DropID))
     {
         DropPacket.SendMakeLeaveFieldPacket(Drop, Type, Option);
     }
 }
Пример #2
0
 public void OnEnter(Character User)
 {
     foreach (Drop Drop in Drops.Values)
     {
         DropPacket.SendMakeEnterFieldPacket(Drop, RewardEnterType.ShowExisting, 0, User);
     }
 }
Пример #3
0
 public void ShowDrop(Character chr)
 {
     if (QuestID != 0 && chr.ID != PlayerID)
     {
         return;
     }
     DropPacket.ShowDrop(chr, this, (byte)DropPacket.DropTypes.ShowExisting, false, new Pos());
 }
Пример #4
0
 public void RemoveDrop(bool showPacket)
 {
     if (showPacket)
     {
         DropPacket.RemoveDrop(this);
     }
     DataProvider.Maps[MapID].RemoveDrop(this);
 }
Пример #5
0
 public void DoDrop(Pos Origin)
 {
     Time = (int)DateTime.Now.Ticks;
     if (QuestID == 0)
     {
         if (!Tradable)
         {
             DropPacket.ShowDrop(null, this, (byte)DropPacket.DropTypes.DisappearDuringDrop, false, Origin);
         }
         else
         {
             DropPacket.ShowDrop(null, this, (byte)DropPacket.DropTypes.DropAnimation, true, Origin);
         }
     }
     else
     {
         Character chr = DataProvider.Maps[MapID].GetPlayer(PlayerID);
         if (chr != null)
         {
             DropPacket.ShowDrop(chr, this, (byte)DropPacket.DropTypes.DropAnimation, true, Origin);
         }
     }
 }
Пример #6
0
        public override void AC_OnPacketInbound(Packet packet)
        {
            ClientMessages header = 0;

            try
            {
                header = (ClientMessages)packet.ReadByte();

                if (!Loaded || Player?.Character == null)
                {
                    switch (header)
                    {
                    case ClientMessages.MIGRATE_IN:
                        OnPlayerLoad(packet);
                        break;     //updated
                    }
                }
                // Block packets as we are migrating
                else if (Server.Instance.InMigration == false || Server.Instance.IsNewServerInMigration)
                {
                    var character = Player.Character;

                    if (logPackets.Contains(header))
                    {
                        PacketLog.ReceivedPacket(packet, (byte)header, Server.Instance.Name, IP);
                    }

                    switch (header)
                    {
                    case ClientMessages.ENTER_PORTAL:
                        MapPacket.OnEnterPortal(packet, character);
                        break;

                    case ClientMessages.CHANGE_CHANNEL:
                        OnChangeChannel(character, packet);
                        break;

                    case ClientMessages.ENTER_CASH_SHOP:
                        OnEnterCashShop(character);
                        break;

                    case ClientMessages.MOVE_PLAYER:
                        MapPacket.HandleMove(character, packet);
                        break;

                    case ClientMessages.SIT_REQUEST:
                        MapPacket.HandleSitChair(character, packet);
                        break;

                    case ClientMessages.ENTER_TOWN_PORTAL:
                        MapPacket.HandleDoorUse(character, packet);
                        break;

                    case ClientMessages.CLOSE_RANGE_ATTACK:
                        AttackPacket.HandleMeleeAttack(character, packet);
                        break;

                    case ClientMessages.RANGED_ATTACK:
                        AttackPacket.HandleRangedAttack(character, packet);
                        break;

                    case ClientMessages.MAGIC_ATTACK:
                        AttackPacket.HandleMagicAttack(character, packet);
                        break;

                    case ClientMessages.TAKE_DAMAGE:
                        CharacterStatsPacket.HandleCharacterDamage(character, packet);
                        break;

                    case ClientMessages.CHAT:
                        MessagePacket.HandleChat(character, packet);
                        break;

                    case ClientMessages.GROUP_MESSAGE:
                        MessagePacket.HandleSpecialChat(character, packet);
                        break;

                    case ClientMessages.WHISPER:
                        MessagePacket.HandleCommand(character, packet);
                        break;

                    case ClientMessages.EMOTE:
                        MapPacket.SendEmotion(character, packet.ReadInt());
                        break;

                    case ClientMessages.NPC_TALK:
                        MapPacket.HandleNPCChat(character, packet);
                        break;

                    case ClientMessages.NPC_TALK_MORE:
                        NpcPacket.HandleNPCChat(character, packet);
                        break;

                    case ClientMessages.SHOP_ACTION:
                        NpcPacket.HandleNPCShop(character, packet);
                        break;

                    case ClientMessages.STORAGE_ACTION:
                        StoragePacket.HandleStorage(character, packet);
                        break;

                    case ClientMessages.ITEM_MOVE:
                        InventoryPacket.HandleInventoryPacket(character, packet);
                        break;

                    case ClientMessages.ITEM_USE:
                        InventoryPacket.HandleUseItemPacket(character, packet);
                        break;

                    case ClientMessages.SUMMON_BAG_USE:
                        InventoryPacket.HandleUseSummonSack(character, packet);
                        break;

                    case ClientMessages.CASH_ITEM_USE:
                        CashPacket.HandleCashItem(character, packet);
                        break;

                    case ClientMessages.RETURN_SCROLL_USE:
                        InventoryPacket.HandleUseReturnScroll(character, packet);
                        break;

                    case ClientMessages.SCROLL_USE:
                        InventoryPacket.HandleScrollItem(character, packet);
                        break;

                    case ClientMessages.DISTRIBUTE_AP:
                        CharacterStatsPacket.HandleStats(character, packet);
                        break;

                    case ClientMessages.HEAL_OVER_TIME:
                        CharacterStatsPacket.HandleHeal(character, packet);
                        break;

                    case ClientMessages.DISTRIBUTE_SP:
                        SkillPacket.HandleAddSkillLevel(character, packet);
                        break;

                    case ClientMessages.PREPARE_SKILL:
                        SkillPacket.HandlePrepareSkill(character, packet);
                        break;

                    case ClientMessages.GIVE_BUFF:
                        SkillPacket.HandleUseSkill(character, packet);
                        break;

                    case ClientMessages.CANCEL_BUFF:
                        SkillPacket.HandleStopSkill(character, packet);
                        break;

                    case ClientMessages.DROP_MESOS:
                        DropPacket.HandleDropMesos(character, packet.ReadInt());
                        break;

                    case ClientMessages.GIVE_FAME:
                        FamePacket.HandleFame(character, packet);
                        break;

                    case ClientMessages.CHAR_INFO_REQUEST:
                        MapPacket.SendPlayerInfo(character, packet);
                        break;

                    case ClientMessages.SPAWN_PET:
                        PetsPacket.HandleSpawnPet(character, packet.ReadShort());
                        break;

                    case ClientMessages.SUMMON_MOVE:
                        MapPacket.HandleSummonMove(character, packet);
                        break;

                    case ClientMessages.SUMMON_ATTACK:
                        AttackPacket.HandleSummonAttack(character, packet);
                        break;

                    case ClientMessages.SUMMON_DAMAGED:
                        MapPacket.HandleSummonDamage(character, packet);
                        break;

                    case ClientMessages.MOB_MOVE:
                        MobPacket.HandleMobControl(character, packet);
                        break;

                    case ClientMessages.NPC_ANIMATE:
                        MapPacket.HandleNPCAnimation(character, packet);
                        break;

                    case ClientMessages.PET_MOVE: PetsPacket.HandleMovePet(character, packet); break;

                    case ClientMessages.PET_INTERACTION: PetsPacket.HandleInteraction(character, packet); break;

                    case ClientMessages.PET_ACTION: PetsPacket.HandlePetAction(character, packet); break;

                    case ClientMessages.FIELD_CONTIMOVE_STATE:
                        MapPacket.OnContiMoveState(character, packet);
                        break;

                    case ClientMessages.DROP_PICK_UP:
                        DropPacket.HandlePickupDrop(character, packet);
                        break;

                    case ClientMessages.MESSENGER:
                        MessengerHandler.HandleMessenger(character, packet);
                        break;

                    case ClientMessages.MINI_ROOM_OPERATION:
                        MiniRoomPacket.HandlePacket(character, packet);
                        break;

                    case ClientMessages.FRIEND_OPERATION:
                        BuddyHandler.HandleBuddy(character, packet);
                        break;

                    case ClientMessages.PARTY_OPERATION:
                        PartyHandler.HandleParty(character, packet);
                        break;

                    case ClientMessages.DENY_PARTY_REQUEST:
                        PartyHandler.HandleDecline(character, packet);
                        break;

                    case ClientMessages.REACTOR_HIT:
                        ReactorPacket.HandleReactorHit(character, packet);
                        break;

                    case ClientMessages.REPORT_USER:
                        MiscPacket.ReportPlayer(character, packet);
                        break;


                    //this is a garbage opcode that i use when doing janky client packet workarounds. This is where packets go to die.
                    case ClientMessages.JUNK:
                        Program.MainForm.LogDebug("received junk packet");
                        break;

                    // eh.. ignore?
                    // Happens when one of the following buffs are set:
                    // Stun, Poison, Seal, Darkness, Weakness, Curse
                    // Maybe patch out of the client
                    case ClientMessages.CHARACTER_IS_DEBUFFED: break;

                    // TODO: Implement???
                    case ClientMessages.MOB_APPLY_CONTROL: break;

                    case ClientMessages.CLIENT_HASH: break;

                    case ClientMessages.PONG:
                        // Make sure we update the player online thing
                        RedisBackend.Instance.SetPlayerOnline(
                            character.UserID,
                            Server.Instance.GetOnlineId()
                            );

                        // Cleanup expired items
                        character.Inventory.CheckExpired();
                        break;

                    default:
                        if (character.Field.HandlePacket(character, packet, header) == false)
                        {
                            Program.MainForm.LogAppend(
                                "[{0}] Unknown packet received! " + packet,
                                header
                                );
                        }

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Program.MainForm.LogAppend($"---- ERROR ----\r\n{ex}");
                Program.MainForm.LogAppend($"Packet: {packet}");
                FileWriter.WriteLine(@"etclog\ExceptionCatcher.log", "[Game Server " + Server.Instance.ID + "][" + DateTime.Now + "] Exception caught: " + ex, true);
                //Disconnect();
            }


#if DEBUG
            if (packet.Length != packet.Position)
            {
                var packetStr = packet.ToString();
                packetStr = packetStr.Substring(0, packet.Position * 3 - 1) + "-x-" + packetStr.Substring(packet.Position * 3);

                log.Debug($"Did not read full message in packet: {header} {packetStr}");
            }
#endif
        }
Пример #7
0
        public bool Create(Reward Reward, int OwnerID, int OwnPartyID, DropType OwnType, int SourceID, Pos CurPos, int x2, short Delay, bool Admin, short Pos, bool ByPet, bool ByUser)
        {
            var Foothold = Field.GetFootholdUnderneath(x2, CurPos.Y - 100, out int y2);

            if (Foothold == null || !Field.IsPointInMBR(x2, y2, true))
            {
                Foothold = Field.GetFootholdClosest(x2, CurPos.Y, ref x2, ref y2, CurPos.X);
            }

            Drop Drop = null;

            if (_MergeDrops && !ByUser && GetDrop(OwnerID, Reward, x2, y2, out Drop))
            {
                Drop.CreateTime = MasterThread.CurrentTime;
                Drop.FFA        = true;
                bool Changed = false;

                if (Drop.Reward.Mesos)
                {
                    int Value = Reward.Drop + Drop.Reward.Drop;
                    if (Drop.Reward.Drop < 50 && Value >= 50)
                    {
                        Changed = true;
                    }
                    else if (Drop.Reward.Drop < 100 && Value >= 100)
                    {
                        Changed = true;
                    }
                    else if (Drop.Reward.Drop < 1000 && Value >= 1000)
                    {
                        Changed = true;
                    }
                    Drop.Reward.Drop = Value;
                }
                else
                {
                    Drop.Reward.GetData().Amount += Reward.Amount;
                }

                DropPacket.SendMakeEnterFieldPacket(Drop, RewardEnterType.DisappearDuringDrop, Delay);

                if (Changed)
                {
                    DropPacket.SendMakeLeaveFieldPacket(Drop, RewardLeaveType.Remove);
                    DropPacket.SendMakeEnterFieldPacket(Drop, RewardEnterType.ShowExisting, 0);
                }
                return(true);
            }
            else
            {
                Drop = new Drop(_DropIdCounter.NextValue(), Reward, OwnerID, OwnPartyID, OwnType, SourceID, CurPos.X, CurPos.Y, (short)x2, (short)y2, ByPet, ByUser)
                {
                    Field           = Field,
                    CreateTime      = MasterThread.CurrentTime,
                    Pos             = Pos,
                    Everlasting     = DropEverlasting,
                    ConsumeOnPickup = (!Reward.Mesos && false /*DataProvider.ConsumeOnPickup.Contains(Reward.ItemID)*/)
                };

                if (!Admin && ByUser && !Drop.Reward.Mesos && ((DataProvider.QuestItems.Contains(Reward.ItemID) || DataProvider.UntradeableDrops.Contains(Reward.ItemID))))
                {
                    DropPacket.SendMakeEnterFieldPacket(Drop, RewardEnterType.DisappearDuringDrop, Delay);
                }
                else
                {
                    Drops.Add(Drop.DropID, Drop);
                    DropPacket.SendMakeEnterFieldPacket(Drop, RewardEnterType.DropAnimation, Delay);
                }
                return(false);
            }
        }
Пример #8
0
 public void TakeDropMob(int mobid)
 {
     DropPacket.MobLootDrop(this, mobid);
     DataProvider.Maps[MapID].RemoveDrop(this);
 }
Пример #9
0
 public void TakeDrop(Character chr, bool petPickup)
 {
     DropPacket.TakeDrop(chr, this, petPickup);
     DataProvider.Maps[MapID].RemoveDrop(this);
 }
Пример #10
0
        public void CheckDead(Pos killPos = null)
        {
            if (HP == 0 && !IsDead)
            {
                IsDead = true;
                if (killPos != null)
                {
                    Position = killPos;
                }
                setControl(null, false, null);
                MobPacket.SendMobDeath(this, 1);
                Character maxDmgChar   = null;
                ulong     maxDmgAmount = 0;
                MobData   md           = DataProvider.Mobs[MobID];
                DeadsInFiveMinutes++;

                foreach (KeyValuePair <int, ulong> dmg in Damages)
                {
                    if (maxDmgAmount < dmg.Value && Server.Instance.CharacterList.ContainsKey(dmg.Key))
                    {
                        Character chr = Server.Instance.CharacterList[dmg.Key];
                        if (chr.Map == MapID)
                        {
                            maxDmgAmount = dmg.Value;
                            maxDmgChar   = chr;
                        }
                    }
                }

                if (maxDmgChar != null)
                {
                    if (Server.Instance.CharacterDatabase.isDonator(maxDmgChar.UserID) || Map.isPremium(maxDmgChar.Map))
                    {
                        maxDmgChar.AddEXP((double)EXP * Server.Instance.mobExpRate * Map.MAP_PREMIUM_EXP); //Premium Maps, also known as Internet Cafe maps
                    }
                    else
                    {
                        maxDmgChar.AddEXP((uint)EXP * Server.Instance.mobExpRate);
                    }
                    DropPacket.HandleDrops(maxDmgChar, MapID, Constants.getDropName(MobID, true), SpawnID, Position, false, false, false);
                }

                foreach (int mobid in md.Revive)
                {
                    DataProvider.Maps[MapID].spawnMobNoRespawn(mobid, killPos, Foothold);
                }



                Damages.Clear();

                if (DoesRespawn)
                {
                    Position = OriginalPosition;
                    Foothold = OriginalFoothold;
                    int derp = (int)(((((SpawnData == null ? 10 : SpawnData.RespawnTime + 1) / DataProvider.Maps[MapID].MobRate)) * DeadsInFiveMinutes) * 5);

                    MasterThread.MasterThread.Instance.AddRepeatingAction(new MasterThread.MasterThread.RepeatingAction("Mob Remover", (date) =>
                    {
                        InitAndSpawn();
                    }, (ulong)derp * 1000, 0));
                }
                else
                {
                    Clearup();
                    DataProvider.Maps[MapID].RemoveMob(this);
                }
            }
        }