public static AdventureRequestResult RedeemCrystal(string playerId, PlayerAdventureRequest adventureRequest, Guid crystalId)
        {
            InventoryUtils.RemoveItemFromInv(playerId, crystalId);

            var selectedAdventureIcon = "genoa:adventure_generic_map_b";
            var selectedAdventureId   = "b7335819-c123-49b9-83fb-8a0ec5032779";

            var adventureLocation = new LocationResponse.ActiveLocation
            {
                coordinate        = adventureRequest.coordinate,
                encounterMetadata = new EncounterMetadata
                {
                    anchorId            = "",
                    anchorState         = "Off",
                    augmentedImageSetId = "",
                    encounterType       = EncounterType.None,
                    locationId          = Guid.Empty,
                    worldId             = Guid.NewGuid()         // TODO: Replace this with actual adventure id
                },
                expirationTime = DateTime.UtcNow.Add(TimeSpan.FromMinutes(10.00)),
                spawnTime      = DateTime.UtcNow,
                icon           = selectedAdventureIcon,
                id             = selectedAdventureId,
                metadata       = new(),
                tileId         = string.Join("-",
                                             Tile.getTileForCords(adventureRequest.coordinate.latitude, adventureRequest.coordinate.longitude)),
                type = "PlayerAdventure"
            };

            return(new AdventureRequestResult {
                result = adventureLocation, updates = new Updates()
            });
        }
    }
Beispiel #2
0
        public static CraftingUpdates ActivateBoost(string playerId, Guid boostId)
        {
            var updates = new CraftingUpdates {
                updates = new Updates()
            };

            List <DateTime> expirationTimes = new List <DateTime>();           // This looks bad (and it totally is), but we can optimize it at a later date
            var             currentTime     = DateTime.UtcNow;

            var baseBoosts   = ReadBoosts(playerId);
            var boostToApply = catalog.result.items.Find(match => match.id == boostId);


            var indexNum = 0;

            if (baseBoosts.result.scenarioBoosts.death != null)
            {
                indexNum = baseBoosts.result.scenarioBoosts.death.Count;                 // Only used if boost is scenario specific
            }
            var nextStreamId = GenericUtils.GetNextStreamVersion();

            var locOfEffect = baseBoosts.result.activeEffects.Find(match => match.effect == boostToApply.item.boostMetadata.effects[0]);             // null when not an active effect, e.g scenario boost

            ActiveBoost locOfBoost = null;


            if (baseBoosts.result.scenarioBoosts.death != null)
            {
                locOfBoost = baseBoosts.result.scenarioBoosts.death.Find(match =>
                                                                         match.effects.Any(pred => pred == boostToApply.item.boostMetadata.effects[0]));
            }

            if (locOfEffect != null && boostToApply.item.boostMetadata.additive && boostToApply.item.boostMetadata.scenario == null)
            {
                locOfEffect.effect.duration += boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay;
                baseBoosts.result.potions.Find(match => match.itemId == boostId).expiration +=
                    boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay;
            }
            else if (locOfBoost != null && boostToApply.item.boostMetadata.additive && boostToApply.item.boostMetadata.scenario == "Death")
            {
                indexNum = baseBoosts.result.scenarioBoosts.death.IndexOf(locOfBoost);
                locOfBoost.expiration += boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay;
                baseBoosts.result.potions.Find(match => match.itemId == boostId).expiration += boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay;
            }
            else
            {
                Dictionary <Guid, string> uuidDict = new Dictionary <Guid, string>();
                if (boostToApply.item.boostMetadata.scenario == null)
                {
                    foreach (Item.Effect effect in boostToApply.item.boostMetadata.effects)
                    {
                        baseBoosts.result.activeEffects.Add(new ActiveEffect {
                            effect = effect, expiration = currentTime.Add(effect.duration.Value)
                        });
                    }
                }
                else
                {
                    baseBoosts.result.scenarioBoosts.death ??= new List <ActiveBoost>();

                    baseBoosts.result.scenarioBoosts.death.Add(new ActiveBoost {
                        effects = new List <Item.Effect>(), enabled = true, expiration = currentTime.Add(boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay), instanceId = Guid.NewGuid().ToString()
                    });

                    foreach (Item.Effect effect in boostToApply.item.boostMetadata.effects)
                    {
                        baseBoosts.result.scenarioBoosts.death[indexNum].effects.Add(effect);
                    }

                    uuidDict.Add(boostId, baseBoosts.result.scenarioBoosts.death[indexNum].instanceId);
                }

                Potion potion = null;

                if (boostToApply.item.boostMetadata.activeDuration != null)
                {
                    potion = new Potion {
                        enabled = true, expiration = currentTime.Add(boostToApply.item.boostMetadata.activeDuration.Value.TimeOfDay), instanceId = Guid.NewGuid().ToString(), itemId = boostId
                    };
                }
                else if (boostToApply.item.boostMetadata.effects[0].duration != null)
                {
                    potion = new Potion {
                        enabled = true, expiration = currentTime.Add(boostToApply.item.boostMetadata.effects[0].duration.Value), instanceId = Guid.NewGuid().ToString(), itemId = boostId
                    };
                }

                if (uuidDict.ContainsKey(boostId) && potion != null)
                {
                    potion.instanceId = uuidDict[boostId];
                }

                var nullPotionIndex = baseBoosts.result.potions.FindIndex(match => match == null);
                if (nullPotionIndex != -1)
                {
                    baseBoosts.result.potions[nullPotionIndex] = potion;
                }
            }


            if (boostToApply.item.boostMetadata.canBeRemoved)
            {
                InventoryUtils.RemoveItemFromInv(playerId, boostId);                 // UNCOMMENT/COMMENT THIS LINE TO REMOVE BOOSTS FROM INVENTORY WHEN USED
                updates.updates.inventory = nextStreamId;
            }

            foreach (ActiveEffect effect in baseBoosts.result.activeEffects)
            {
                expirationTimes.Add(effect.expiration.Value);
            }

            if (baseBoosts.result.scenarioBoosts.death != null)
            {
                foreach (ActiveBoost boost in baseBoosts.result.scenarioBoosts.death)
                {
                    expirationTimes.Add(boost.expiration.Value);
                }
            }

            baseBoosts.result.expiration = expirationTimes.Min();

            baseBoosts.result.statusEffects = CalculateStatusEffects(baseBoosts);

            WriteBoosts(playerId, baseBoosts);
            updates.updates.boosts = nextStreamId;
            return(updates);
        }
Beispiel #3
0
        public static bool StartCraftingJob(string playerId, int slot, CraftingRequest request)         // TODO: Check if slot not unlocked (not a big priority)
        {
            recipeList ??= Recipes.FromFile("./data/recipes");

            var recipe = recipeList.result.crafting.Find(match => match.id == request.RecipeId);

            if (recipe != null)
            {
                var itemsToReturn = recipe.returnItems.ToList();

                foreach (RecipeIngredients ingredient in recipe.ingredients)
                {
                    if (itemsToReturn.Find(match =>
                                           match.id == ingredient.items[0] && match.amount == ingredient.quantity) == null)
                    {
                        InventoryUtils.RemoveItemFromInv(playerId, ingredient.items[0], ingredient.quantity * request.Multiplier);
                    }
                }

                var nextStreamId = GenericUtils.GetNextStreamVersion();

                CraftingSlotInfo job = new CraftingSlotInfo
                {
                    available          = 0,
                    boostState         = null,
                    completed          = 0,
                    escrow             = request.Ingredients,
                    nextCompletionUtc  = null,
                    output             = recipe.output,
                    recipeId           = recipe.id,
                    sessionId          = request.SessionId,
                    state              = "Active",
                    streamVersion      = nextStreamId,
                    total              = request.Multiplier,
                    totalCompletionUtc = DateTime.UtcNow.Add(recipe.duration.TimeOfDay * request.Multiplier),
                    unlockPrice        = null
                };

                if (request.Multiplier != 1)
                {
                    job.nextCompletionUtc = DateTime.UtcNow.Add(recipe.duration.TimeOfDay);
                }

                if (!craftingJobs.ContainsKey(playerId))
                {
                    craftingJobs.Add(playerId, new Dictionary <int, CraftingSlotInfo>());
                    craftingJobs[playerId].Add(1, new CraftingSlotInfo());
                    craftingJobs[playerId].Add(2, new CraftingSlotInfo());
                    craftingJobs[playerId].Add(3, new CraftingSlotInfo());
                }

                craftingJobs[playerId][slot] = job;

                UtilityBlockUtils.UpdateUtilityBlocks(playerId, slot, job);

                Log.Debug($"[{playerId}]: Initiated crafting job in slot {slot}.");

                return(true);
            }

            return(false);
        }