protected override void Process(GameSession session, Scp packet) { Character character = session.Character; if (character.Pet != null && character.Pet.Id == packet.PetId) { if (packet.Loyalty != character.Pet.Loyalty) { eventPipeline.Process(session, new PetLoyaltyChanged()); } return; } MonsterData data = database.GetMonsterData(packet.ModelId); string name = languageService.GetTranslation(TranslationCategory.Monster, data.NameKey); var pet = new OwnedPet { Id = packet.PetId, EntityId = packet.EntityId, ModelId = packet.ModelId, Name = packet.Name == "-" || packet.Name == "@" ? name : packet.Name, IsSummonable = packet.IsSummonable, IsTeamMember = packet.IsTeamMember, Level = packet.Level, Loyalty = packet.Loyalty }; character.Pets.Add(pet); if (pet.IsTeamMember) { Npc entity = character.Map.GetEntity <Npc>(EntityType.Npc, pet.EntityId); if (entity == null) { return; } character.Pet = new Pet(character, pet, entity); } }
protected override void Process(GameSession session, In packet) { Map map = session.Character.Map; Entity entity; switch (packet.EntityType) { case EntityType.Monster: Monster monster = entityFactory.CreateMonster(packet.ModelId, packet.EntityId); monster.Position = packet.Position; monster.HpPercentage = packet.Npc.HpPercentage; monster.MpPercentage = packet.Npc.MpPercentage; monster.Map = map; monster.Map.Monsters[monster.Id] = monster; entity = monster; break; case EntityType.Npc: Npc npc = entityFactory.CreateNpc(packet.ModelId, packet.EntityId, packet.Npc.Name); npc.Position = packet.Position; npc.HpPercentage = packet.Npc.HpPercentage; npc.MpPercentage = packet.Npc.MpPercentage; npc.Map = map; npc.Map.Npcs[npc.Id] = npc; entity = npc; OwnedPet pet = session.Character.Pets.FirstOrDefault(x => x.EntityId == entity.Id && x.IsTeamMember); if (pet != null) { session.Character.Pet = new Pet(session.Character, pet, npc); } break; case EntityType.MapObject: MapObject mapObject = entityFactory.CreateMapObject(packet.ModelId, packet.EntityId, packet.MapObject.Amount); Player owner = map.GetEntity <Player>(EntityType.Player, packet.MapObject.Owner); if (owner == null) { Log.Debug($"Can't found owner of map object {mapObject.Id}"); } mapObject.Position = packet.Position; mapObject.Owner = owner; mapObject.Map = map; mapObject.Map.MapObjects[mapObject.Id] = mapObject; entity = mapObject; break; case EntityType.Player: var player = new Player(packet.EntityId, packet.Name) { Gender = packet.Player.Gender, Job = packet.Player.Job, HpPercentage = packet.Player.HpPercentage, MpPercentage = packet.Player.MpPercentage, Position = packet.Position, Level = packet.Player.Level, HeroLevel = packet.Player.HeroLevel, Map = map }; player.Map.Players[player.Id] = player; entity = player; break; default: return; } eventPipeline.Process(session, new EntityJoinEvent { Entity = entity, Map = map }); Log.Trace($"Entity {packet.EntityType} with ID {packet.EntityId} added to map."); }