private static void HandleStart(GameSession session, PacketReader packet) { string uuid = packet.ReadMapleString(); MapInteractObject interactObject = MapEntityStorage.GetInteractObject(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid); if (interactObject.Type == InteractObjectType.Gathering) { // things to do when player starts gathering } }
private static void HandleUse(GameSession session, PacketReader packet) { string uuid = packet.ReadMapleString(); IFieldObject <InteractObject> interactObject = session.FieldManager.State.InteractObjects[uuid]; if (interactObject == null) { return; } MapInteractObject mapObject = MapEntityStorage.GetInteractObject(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid); int numDrop = 0; switch (interactObject.Value.Type) { case InteractObjectType.Binoculars: QuestHelper.UpdateExplorationQuest(session, mapObject.InteractId.ToString(), "interact_object_rep"); break; case InteractObjectType.Gathering: RecipeMetadata recipe = RecipeMetadataStorage.GetRecipe(mapObject.RecipeId); session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, 0); long currentMastery = session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == (MasteryType)recipe.MasteryType).CurrentExp; if (currentMastery < recipe.RequireMastery) { return; } session.Player.IncrementGatheringCount(mapObject.RecipeId, 0); int numCount = session.Player.GatheringCount[mapObject.RecipeId].Current; List <RecipeItem> items = RecipeMetadataStorage.GetResult(recipe); int masteryDiffFactor = numCount switch { int n when n < recipe.HighPropLimitCount => MasteryFactorMetadataStorage.GetFactor(0), int n when n < recipe.NormalPropLimitCount => MasteryFactorMetadataStorage.GetFactor(1), int n when n < (int)(recipe.NormalPropLimitCount * 1.3) => MasteryFactorMetadataStorage.GetFactor(2), _ => MasteryFactorMetadataStorage.GetFactor(3), }; foreach (RecipeItem item in items) { int prob = RarityChance[item.Rarity] * masteryDiffFactor / 10000; if (RandomProvider.Get().Next(100) >= prob) { continue; } for (int i = 0; i < item.Amount; i++) { session.FieldManager.AddItem(session, new Item(item.Id)); } numDrop += item.Amount; } if (numDrop > 0) { session.Player.IncrementGatheringCount(mapObject.RecipeId, numDrop); session.Player.Levels.GainMasteryExp((MasteryType)recipe.MasteryType, recipe.RewardMastery); } break; case InteractObjectType.AdBalloon: session.Send(PlayerHostPacket.AdBalloonWindow(interactObject)); return; default: break; } session.Send(InteractObjectPacket.UseObject(mapObject, (short)(numDrop > 0 ? 0 : 1), numDrop)); session.Send(InteractObjectPacket.Extra(mapObject)); }
public FieldManager(int mapId, long instanceId) { MapId = mapId; InstanceId = instanceId; BoundingBox = MapEntityStorage.GetBoundingBox(mapId); // Load default npcs for map from config foreach (MapNpc npc in MapEntityStorage.GetNpcs(mapId)) { IFieldObject <Npc> fieldNpc = RequestFieldObject(new Npc(npc.Id) { ZRotation = (short)(npc.Rotation.Z * 10) }); if (fieldNpc.Value.Friendly == 2) { fieldNpc.Coord = npc.Coord.ToFloat(); AddNpc(fieldNpc); } else { // NPC is an enemy IFieldObject <Mob> fieldMob = RequestFieldObject(new Mob(npc.Id) { ZRotation = (short)(npc.Rotation.Z * 10) }); fieldMob.Coord = npc.Coord.ToFloat(); AddMob(fieldMob); } } // Spawn map's mobs at the mob spawners foreach (MapMobSpawn mobSpawn in MapEntityStorage.GetMobSpawns(mapId)) { if (mobSpawn.SpawnData == null) { Debug.WriteLine($"Missing mob spawn data: {mobSpawn}"); continue; } IFieldObject <MobSpawn> fieldMobSpawn = RequestFieldObject(new MobSpawn(mobSpawn)); fieldMobSpawn.Coord = mobSpawn.Coord.ToFloat(); State.AddMobSpawn(fieldMobSpawn); SpawnMobs(fieldMobSpawn); } // Load default portals for map from config foreach (MapPortal portal in MapEntityStorage.GetPortals(mapId)) { IFieldObject <Portal> fieldPortal = RequestFieldObject(new Portal(portal.Id) { IsVisible = portal.IsVisible, IsEnabled = portal.Enable, IsMinimapVisible = portal.MinimapVisible, Rotation = portal.Rotation.ToFloat(), TargetMapId = portal.Target, PortalType = portal.PortalType }); fieldPortal.Coord = portal.Coord.ToFloat(); AddPortal(fieldPortal); } // Load default InteractObjects List <IFieldObject <InteractObject> > actors = new List <IFieldObject <InteractObject> > { }; foreach (MapInteractObject interactObject in MapEntityStorage.GetInteractObject(mapId)) { // TODO: Group these fieldActors by their correct packet type. actors.Add(RequestFieldObject(new InteractObject(interactObject.Uuid, interactObject.Name, interactObject.Type) { })); } AddInteractObject(actors); MapMetadata mapMetadata = MapMetadataStorage.GetMetadata(mapId); if (mapMetadata != null) { string xBlockName = mapMetadata.XBlockName; Triggers = TriggerLoader.GetTriggers(xBlockName).Select(initializer => { TriggerContext context = new TriggerContext(this, Logger); TriggerState startState = initializer.Invoke(context); return(new TriggerScript(context, startState)); }).ToArray(); } foreach (MapTriggerMesh mapTriggerMesh in MapEntityStorage.GetTriggerMeshes(mapId)) { if (mapTriggerMesh != null) { TriggerMesh triggerMesh = new TriggerMesh(mapTriggerMesh.Id, mapTriggerMesh.IsVisible); State.AddTriggerObject(triggerMesh); } } foreach (MapTriggerEffect mapTriggerEffect in MapEntityStorage.GetTriggerEffects(mapId)) { if (mapTriggerEffect != null) { TriggerEffect triggerEffect = new TriggerEffect(mapTriggerEffect.Id, mapTriggerEffect.IsVisible); State.AddTriggerObject(triggerEffect); } } foreach (MapTriggerActor mapTriggerActor in MapEntityStorage.GetTriggerActors(mapId)) { if (mapTriggerActor != null) { TriggerActor triggerActor = new TriggerActor(mapTriggerActor.Id, mapTriggerActor.IsVisible, mapTriggerActor.InitialSequence); State.AddTriggerObject(triggerActor); } } foreach (MapTriggerCamera mapTriggerCamera in MapEntityStorage.GetTriggerCameras(mapId)) { if (mapTriggerCamera != null) { TriggerCamera triggerCamera = new TriggerCamera(mapTriggerCamera.Id, mapTriggerCamera.IsEnabled); State.AddTriggerObject(triggerCamera); } } foreach (MapTriggerCube mapTriggerCube in MapEntityStorage.GetTriggerCubes(mapId)) { if (mapTriggerCube != null) { TriggerCube triggerCube = new TriggerCube(mapTriggerCube.Id, mapTriggerCube.IsVisible); State.AddTriggerObject(triggerCube); } } foreach (MapTriggerLadder mapTriggerLadder in MapEntityStorage.GetTriggerLadders(mapId)) { if (mapTriggerLadder != null) { TriggerLadder triggerLadder = new TriggerLadder(mapTriggerLadder.Id, mapTriggerLadder.IsVisible); State.AddTriggerObject(triggerLadder); } } foreach (MapTriggerRope mapTriggerRope in MapEntityStorage.GetTriggerRopes(mapId)) { if (mapTriggerRope != null) { TriggerRope triggerRope = new TriggerRope(mapTriggerRope.Id, mapTriggerRope.IsVisible); State.AddTriggerObject(triggerRope); } } foreach (MapTriggerSound mapTriggerSound in MapEntityStorage.GetTriggerSounds(mapId)) { if (mapTriggerSound != null) { TriggerSound triggerSound = new TriggerSound(mapTriggerSound.Id, mapTriggerSound.IsEnabled); State.AddTriggerObject(triggerSound); } } // Load breakables foreach (MapBreakableActorObject mapActor in MapEntityStorage.GetBreakableActors(mapId)) { if (mapActor != null) { BreakableActorObject actor = new BreakableActorObject(mapActor.EntityId, mapActor.IsEnabled, mapActor.HideDuration, mapActor.ResetDuration); State.AddBreakable(actor); } } foreach (MapBreakableNifObject mapNif in MapEntityStorage.GetBreakableNifs(mapId)) { if (mapNif != null) { BreakableNifObject nif = new BreakableNifObject(mapNif.EntityId, mapNif.IsEnabled, mapNif.TriggerId, mapNif.HideDuration, mapNif.ResetDuration); State.AddBreakable(nif); } } if (MapEntityStorage.HasHealingSpot(MapId)) { List <CoordS> healingSpots = MapEntityStorage.GetHealingSpot(MapId); if (State.HealingSpots.IsEmpty) { foreach (CoordS coord in healingSpots) { int objectId = GuidGenerator.Int(); State.AddHealingSpot(RequestFieldObject(new HealingSpot(objectId, coord))); } } } }
private static void HandleUse(GameSession session, PacketReader packet) { string uuid = packet.ReadMapleString(); MapInteractObject interactObject = MapEntityStorage.GetInteractObject(session.Player.MapId).FirstOrDefault(x => x.Uuid == uuid); int numDrop = 0; if (interactObject == null) { return; } if (interactObject.Type == InteractObjectType.Binoculars) { QuestHelper.UpdateExplorationQuest(session, interactObject.InteractId.ToString(), "interact_object_rep"); } else if (interactObject.Type == InteractObjectType.Gathering) { RecipeMetadata recipe = RecipeMetadataStorage.GetRecipe(interactObject.RecipeId); long requireMastery = int.Parse(recipe.RequireMastery); Enums.MasteryType type = (Enums.MasteryType) int.Parse(recipe.MasteryType); session.Player.Levels.GainMasteryExp(type, 0); long currentMastery = session.Player.Levels.MasteryExp.FirstOrDefault(x => x.Type == type).CurrentExp; if (currentMastery < requireMastery) { return; } session.Player.IncrementGatheringCount(interactObject.RecipeId, 0); int numCount = session.Player.GatheringCount[interactObject.RecipeId].Current; List <RecipeItem> items = RecipeMetadataStorage.GetResult(recipe); Random rand = new Random(); int masteryDiffFactor = numCount switch { int n when n < recipe.HighPropLimitCount => MasteryFactorMetadataStorage.GetFactor(0), int n when n < recipe.NormalPropLimitCount => MasteryFactorMetadataStorage.GetFactor(1), int n when n < (int)(recipe.NormalPropLimitCount * 1.3) => MasteryFactorMetadataStorage.GetFactor(2), _ => MasteryFactorMetadataStorage.GetFactor(3), }; foreach (RecipeItem item in items) { int prob = (int)(RarityChance[item.Rarity] * masteryDiffFactor) / 10000; if (rand.Next(100) >= prob) { continue; } for (int i = 0; i < item.Amount; i++) { session.FieldManager.AddItem(session, new Item(item.Id)); } numDrop += item.Amount; } if (numDrop > 0) { session.Player.IncrementGatheringCount(interactObject.RecipeId, numDrop); session.Player.Levels.GainMasteryExp(type, recipe.RewardMastery); } } session.Send(InteractObjectPacket.UseObject(interactObject, (short)(numDrop > 0 ? 0 : 1), numDrop)); session.Send(InteractObjectPacket.Extra(interactObject)); }
public FieldManager(int mapId) { MapId = mapId; BoundingBox = MapEntityStorage.GetBoundingBox(mapId); // Load default npcs for map from config foreach (MapNpc npc in MapEntityStorage.GetNpcs(mapId)) { IFieldObject <Npc> fieldNpc = RequestFieldObject(new Npc(npc.Id) { ZRotation = (short)(npc.Rotation.Z * 10) }); if (fieldNpc.Value.Friendly == 2) { fieldNpc.Coord = npc.Coord.ToFloat(); AddNpc(fieldNpc); } else { // NPC is an enemy IFieldObject <Mob> fieldMob = RequestFieldObject(new Mob(npc.Id) { ZRotation = (short)(npc.Rotation.Z * 10) }); fieldMob.Coord = npc.Coord.ToFloat(); AddMob(fieldMob); } } // Spawn map's mobs at the mob spawners foreach (MapMobSpawn mobSpawn in MapEntityStorage.GetMobSpawns(mapId)) { if (mobSpawn.SpawnData == null) { Debug.WriteLine($"Missing mob spawn data: {mobSpawn}"); continue; } IFieldObject <MobSpawn> fieldMobSpawn = RequestFieldObject(new MobSpawn(mobSpawn)); fieldMobSpawn.Coord = mobSpawn.Coord.ToFloat(); State.AddMobSpawn(fieldMobSpawn); SpawnMobs(fieldMobSpawn); } // Load default portals for map from config foreach (MapPortal portal in MapEntityStorage.GetPortals(mapId)) { IFieldObject <Portal> fieldPortal = RequestFieldObject(new Portal(portal.Id) { IsVisible = portal.Flags.HasFlag(MapPortalFlag.Visible), IsEnabled = portal.Flags.HasFlag(MapPortalFlag.Enabled), IsMinimapVisible = portal.Flags.HasFlag(MapPortalFlag.MinimapVisible), Rotation = portal.Rotation.ToFloat(), TargetMapId = portal.Target, }); fieldPortal.Coord = portal.Coord.ToFloat(); AddPortal(fieldPortal); } // Load default InteractObjects List <IFieldObject <InteractObject> > actors = new List <IFieldObject <InteractObject> > { }; foreach (MapInteractObject interactObject in MapEntityStorage.GetInteractObject(mapId)) { // TODO: Group these fieldActors by their correct packet type. actors.Add(RequestFieldObject(new InteractObject(interactObject.Uuid, interactObject.Name, interactObject.Type) { })); } AddInteractObject(actors); string mapName = MapMetadataStorage.GetMetadata(mapId).Name; Triggers = TriggerLoader.GetTriggers(mapName).Select(initializer => { TriggerContext context = new TriggerContext(this, Logger); TriggerState startState = initializer.Invoke(context); return(new TriggerScript(context, startState)); }).ToArray(); if (MapEntityStorage.HasHealingSpot(MapId)) { List <CoordS> healingSpots = MapEntityStorage.GetHealingSpot(MapId); if (State.HealingSpots.IsEmpty) { foreach (CoordS coord in healingSpots) { int objectId = GuidGenerator.Int(); State.AddHealingSpot(RequestFieldObject(new HealingSpot(objectId, coord))); } } } }