terraria-source-code/GameContent/Bestiary/BestiaryDatabase.cs
2021-10-26 12:45:26 -04:00

86 lines
3 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Terraria.GameContent.Bestiary.BestiaryDatabase
// Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null
// MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83
// Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe
using System.Collections.Generic;
using Terraria.GameContent.ItemDropRules;
namespace Terraria.GameContent.Bestiary
{
public class BestiaryDatabase
{
private List<BestiaryEntry> _entries = new List<BestiaryEntry>();
private List<IBestiaryEntryFilter> _filters = new List<IBestiaryEntryFilter>();
private List<IBestiarySortStep> _sortSteps = new List<IBestiarySortStep>();
private Dictionary<int, BestiaryEntry> _byNpcId = new Dictionary<int, BestiaryEntry>();
private BestiaryEntry _trashEntry = new BestiaryEntry();
public List<BestiaryEntry> Entries => this._entries;
public List<IBestiaryEntryFilter> Filters => this._filters;
public List<IBestiarySortStep> SortSteps => this._sortSteps;
public BestiaryEntry Register(BestiaryEntry entry)
{
this._entries.Add(entry);
for (int index = 0; index < entry.Info.Count; ++index)
{
if (entry.Info[index] is NPCNetIdBestiaryInfoElement bestiaryInfoElement1)
this._byNpcId[bestiaryInfoElement1.NetId] = entry;
}
return entry;
}
public IBestiaryEntryFilter Register(IBestiaryEntryFilter filter)
{
this._filters.Add(filter);
return filter;
}
public IBestiarySortStep Register(IBestiarySortStep sortStep)
{
this._sortSteps.Add(sortStep);
return sortStep;
}
public BestiaryEntry FindEntryByNPCID(int npcNetId)
{
BestiaryEntry bestiaryEntry;
if (this._byNpcId.TryGetValue(npcNetId, out bestiaryEntry))
return bestiaryEntry;
this._trashEntry.Info.Clear();
return this._trashEntry;
}
public void Merge(ItemDropDatabase dropsDatabase)
{
for (int npcId = -65; npcId < 663; ++npcId)
this.ExtractDropsForNPC(dropsDatabase, npcId);
}
private void ExtractDropsForNPC(ItemDropDatabase dropsDatabase, int npcId)
{
BestiaryEntry entryByNpcid = this.FindEntryByNPCID(npcId);
if (entryByNpcid == null)
return;
List<IItemDropRule> rulesForNpcid = dropsDatabase.GetRulesForNPCID(npcId, false);
List<DropRateInfo> drops = new List<DropRateInfo>();
DropRateInfoChainFeed ratesInfo = new DropRateInfoChainFeed(1f);
foreach (IItemDropRule itemDropRule in rulesForNpcid)
itemDropRule.ReportDroprates(drops, ratesInfo);
foreach (DropRateInfo info in drops)
entryByNpcid.Info.Add((IBestiaryInfoElement) new ItemDropBestiaryInfoElement(info));
}
public void ApplyPass(BestiaryDatabase.BestiaryEntriesPass pass)
{
for (int index = 0; index < this._entries.Count; ++index)
pass(this._entries[index]);
}
public delegate void BestiaryEntriesPass(BestiaryEntry entry);
}
}