public virtual void RemovePlayer(Character pCharacter, byte pReason) { //Users[pCharacter.RoomSlotId] = null; MiniRoomPacket.ShowLeave(this, pCharacter, pReason); Users[pCharacter.RoomSlotId] = null; pCharacter.Room = null; pCharacter.RoomSlotId = 0; EnteredUsers--; if (EnteredUsers == 0) { this.Close(0); } }
private static void EnterMiniRoom(Character chr, Packet packet) { if (chr.Room != null) { miniroomLog.Info($"{chr.Name} cannot enter miniroom: already in one."); return; // Already in a Mini Room } //MessagePacket.SendNotice("PACKET: " + packet.ToString(), chr); int roomId = packet.ReadInt(); if (!MiniRoomBase.MiniRooms.TryGetValue(roomId, out var mrb)) { ReportManager.FileNewReport("Tried entering a trade room without a proper ID.", chr.ID, 0); return; // Invalid Room ID } if (mrb.EnteredUsers == 0) { return; } if (mrb.IsFull()) { miniroomLog.Info($"{chr.Name} cannot enter miniroom: already full."); return; // Error msg if full? } if (mrb.Users.ToList().Exists(u => u != null && u.MapID != chr.MapID)) { InviteResult(chr, 1); // must be on same map. Show "not found" msg return; } chr.Room = mrb; byte nType = (byte)chr.Room.Type; switch (nType) { case 1: // Omok { bool usePassword = packet.ReadBool(); Omok omok = MiniRoomBase.Omoks[chr.Room.ID]; if (usePassword) { string password = packet.ReadString(); if (password != omok.Password) { miniroomLog.Info($"{chr.Name} cannot enter omok: invalid password"); MiniGamePacket.ErrorMessage(chr, MiniGamePacket.MiniGameError.IncorrectPassword); chr.Room = null; break; } } if (chr.Inventory.Mesos >= 100) { omok.AddPlayer(chr); MiniGamePacket.AddVisitor(chr, mrb); MiniGamePacket.ShowWindow(chr, mrb, omok.OmokType); chr.AddMesos(-100); miniroomLog.Info($"{chr.Name} entered omok"); } else { miniroomLog.Info($"{chr.Name} cannot enter omok: not enough mesos"); MiniGamePacket.ErrorMessage(chr, MiniGamePacket.MiniGameError.NotEnoughMesos); } break; } case 3: // Trade { miniroomLog.Info($"{chr.Name} entered trade"); mrb.AddPlayer(chr); MiniRoomPacket.ShowJoin(mrb, chr); MiniRoomPacket.ShowWindow(mrb, chr); break; } case 4: // Player Shop { miniroomLog.Info($"{chr.Name} entered playershop"); PlayerShop shop = MiniRoomBase.PlayerShops[roomId]; for (int i = 0; i < shop.EnteredUsers; i++) { Character shopUser = mrb.Users[i]; if (shopUser != null && shopUser != chr) { shop.AddPlayer(chr); PlayerShopPackets.AddPlayer(chr, shopUser); PlayerShopPackets.OpenPlayerShop(chr, mrb); PlayerShopPackets.PersonalShopRefresh(chr, shop); //Show items } } break; } } }
private static void CreateMiniRoomBase(Character chr, Packet packet) { if (chr.Room != null) { return; } byte nType = packet.ReadByte(); switch (nType) { case 0: // What is this case? { break; } case 1: // Omok { miniroomLog.Info($"{chr.Name} creates an omok miniroom"); MiniRoomBase omok = MiniRoomBase.CreateRoom(chr, 1, packet, false, 0); chr.Room = omok; MiniGamePacket.ShowWindow(chr, omok, MiniRoomBase.Omoks[chr.Room.ID].OmokType); MiniGamePacket.AddAnnounceBox(chr, (byte)MiniRoomBase.RoomType.Omok, omok.ID, omok.Title, omok.Private, omok.PieceType, false); break; } case 2: // Match Cards TODO! { return; miniroomLog.Info($"{chr.Name} creates a match cards"); string title = packet.ReadString(); bool usePassword = packet.ReadBool(); string password = ""; if (usePassword) { password = packet.ReadString(); } packet.Skip(7); byte cardType = packet.ReadByte(); break; } case 3: // Trade { miniroomLog.Info($"{chr.Name} creates a trade miniroom"); MiniRoomBase mrb = MiniRoomBase.CreateRoom(chr, nType, packet, false, 0); chr.Room = mrb; MiniRoomPacket.ShowWindow(mrb, chr); break; } case 4: // Player Shops { return; miniroomLog.Info($"{chr.Name} creates a player shop miniroom"); MiniRoomBase mrb = MiniRoomBase.CreateRoom(chr, nType, packet, false, 0); chr.Room = mrb; PlayerShopPackets.OpenPlayerShop(chr, mrb); break; } } }
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 }