예제 #1
0
    void ReadLootInfo(string LootID)
    {
        SqlCommand sqcmd = new SqlCommand();

        sqcmd.CommandType = CommandType.StoredProcedure;
        sqcmd.CommandText = "WO_LootGetData";
        sqcmd.Parameters.AddWithValue("@in_LootID", LootID);
        if (!CallWOApi(sqcmd))
        {
            return;
        }

        // get item category
        reader.Read();
        category_ = getInt("Category");

        // get content
        reader.NextResult();
        while (reader.Read())
        {
            LootEntry le = new LootEntry();
            le.Chance     = Convert.ToDouble(reader["Chance"]);
            le.ItemID     = Convert.ToInt32(reader["ItemID"]);
            le.ExpDaysMin = Convert.ToInt32(reader["ExpDaysMin"]);
            le.ExpDaysMax = Convert.ToInt32(reader["ExpDaysMax"]);
            le.GDMin      = Convert.ToInt32(reader["GDMin"]);
            le.GDMax      = Convert.ToInt32(reader["GDMax"]);
            le.GDIfHave   = Convert.ToInt32(reader["GDIfHave"]);

            loots_.Add(le);
        }

        if (loots_.Count == 0)
        {
            throw new ApiExitException("loot box is empty");
        }

        // renormalize
        double Sum = 0.0;

        foreach (LootEntry le in loots_)
        {
            Sum += le.Chance;
        }
        foreach (LootEntry le in loots_)
        {
            le.Chance /= Sum;
        }

        // bring to [0..1]
        Sum = loots_[0].Chance;
        for (int i = 1; i < loots_.Count; i++)
        {
            double Chance = loots_[i].Chance;
            loots_[i].Chance += Sum;
            Sum += Chance;
        }
    }
예제 #2
0
    public static List <ItemDefinition> GenerateLoot(List <LootDefinition> battleLoot, RaidInfo raid)
    {
        List <ItemDefinition> lootItems = new List <ItemDefinition>();

        for (int i = 0; i < battleLoot.Count; i++)
        {
            for (int j = 0; j < battleLoot[i].Count; j++)
            {
                LootEntry entry = GetLootEntry(battleLoot[i].Code, raid);
                switch (entry.Type)
                {
                case LootType.Item:
                    LootEntryItem  itemEntry = entry as LootEntryItem;
                    ItemDefinition data      = new ItemDefinition();
                    data.Type   = itemEntry.ItemType;
                    data.Id     = itemEntry.ItemId;
                    data.Amount = itemEntry.ItemAmount;
                    lootItems.Add(data);
                    break;

                case LootType.Journal:
                    LootEntryJournal journalEntry = entry as LootEntryJournal;
                    ItemDefinition   dataJournal  = new ItemDefinition();
                    dataJournal.Type = "journal_page";
                    if (journalEntry.SpecificId.HasValue)
                    {
                        dataJournal.Id = journalEntry.SpecificId.Value.ToString();
                    }
                    else
                    {
                        dataJournal.Id = RandomSolver.Next(journalEntry.MinIndex, journalEntry.MaxIndex + 1).ToString();
                    }
                    dataJournal.Amount = 1;
                    lootItems.Add(dataJournal);
                    break;

                case LootType.Trinket:
                    LootEntryTrinket trinketEntry = entry as LootEntryTrinket;
                    var trinketList = DarkestDungeonManager.Data.Items["trinket"].Values.ToList().
                                      FindAll(trinket => ((Trinket)trinket).RarityId == trinketEntry.Rarity);

                    Trinket        trinketItem = (Trinket)trinketList[RandomSolver.Next(trinketList.Count)];
                    ItemDefinition trinketDef  = new ItemDefinition();
                    trinketDef.Type   = trinketItem.Type;
                    trinketDef.Id     = trinketItem.Id;
                    trinketDef.Amount = trinketDef.Amount;
                    lootItems.Add(trinketDef);
                    break;

                case LootType.Nothing:
                    break;
                }
            }
        }
        return(lootItems);
    }
예제 #3
0
    private static LootEntry GetLootEntry(string tableId, RaidInfo raid)
    {
        LootTable lootTable = LootDatabase.LootTables[tableId.ToUpper()].
                              Find(table => ((table.Difficulty == raid.Quest.Difficulty) || (table.Difficulty == 0)) &&
                                   ((table.Dungeon == raid.Dungeon.Name) || (table.Dungeon == "")));

        LootEntry lootEntry = RandomSolver.ChooseBySingleRandom(lootTable.Entries);

        return(lootEntry.Type != LootType.Table ? lootEntry : GetLootEntry(((LootEntryTable)lootEntry).TableId, raid));
    }
예제 #4
0
        public static LootEntry FindLooter(Mobile from)
        {
            for (int i = 0; i < m_Table.Count; i++)
            {
                if (from == m_Table[i].Looter)
                {
                    return(m_Table[i]);
                }
            }

            var entry = new LootEntry(from);

            m_Table.Add(entry);
            return(entry);
        }
예제 #5
0
        void OnLootEntity(BasePlayer looter, BaseEntity entity)
        {
            if (looter == null || entity == null || !IsValidType(entity))
            {
                return;
            }

            var time      = GrabCurrentTime();
            var date      = DateTime.Now.ToString("d/M HH:mm:ss");
            var lootEntry = new LootEntry
            {
                FirstLoot = date,
                LastInit  = time,
                LastLoot  = date,
                Name      = looter.displayName
            };

            if (entity is BasePlayer)
            {
                var looted = entity.ToPlayer();
                if (!playerCache.ContainsKey(looted.userID))
                {
                    playerCache.Add(looted.userID, new PlayerData(time, looter));
                }
                else
                {
                    playerCache[looted.userID].lastInit = time;
                    playerCache[looted.userID].AddLoot(looter, time, date);
                }
            }
            else
            {
                if (entity?.net?.ID == null)
                {
                    return;
                }
                var boxId = entity.net.ID;
                if (!boxCache.ContainsKey(boxId))
                {
                    boxCache.Add(boxId, new BoxData(time, looter, entity.transform.position));
                }
                else
                {
                    boxCache[boxId].lastInit = time;
                    boxCache[boxId].AddLoot(looter, time, date);
                }
            }
        }
예제 #6
0
        public static void RegisterFastloot(Mobile from, TimeSpan lootTime)
        {
            if (from == null || !(from is PlayerMobile))
            {
                return;
            }

            LootEntry entry = FindLooter(from);

            entry.Count++;

            if (lootTime < entry.Fastest)
            {
                entry.Fastest = lootTime;
            }
        }
예제 #7
0
            public void AddEntry(BasePlayer player, string date)
            {
                LootEntry lastEntry = null;

                try { lastEntry = looters.Single(x => x.userId == player.UserIDString); } catch { }
                if (lastEntry != null)
                {
                    looters.Remove(lastEntry);
                    lastEntry.lastLoot = date;
                }
                else
                {
                    if (looters.Count == ins.configData.RecordsPerContainer)
                    {
                        looters.Remove(looters.ElementAt(0));
                    }
                    lastEntry = new LootEntry(player, date);
                }
                looters.Add(lastEntry);
            }