/
NPCDropInfo.cs
162 lines (147 loc) · 4.48 KB
/
NPCDropInfo.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using Terraria;
using Terraria.Utilities;
using Terraria.ModLoader;
using Newtonsoft.Json;
namespace NPCInfo
{
public class DropItem
{
public int id;
public string mod;
public string name;
public int min;
public int max;
public DropItem()
{
}
public DropItem(Item item)
{
id = item.netID;
name = item.Name;
if (item.modItem != null)
{
mod = item.modItem.mod.Name;
name = item.modItem.Name;
}
min = max = 1;
}
}
public class DropItemList
{
public int rate;
public bool expert;
public List<DropItem> items = new List<DropItem>();
}
public class NPCDropInfo
{
public int id;
public string mod;
public string name;
public List<DropItemList> list = new List<DropItemList>();
public NPCDropInfo()
{
}
public NPCDropInfo(NPC npc)
{
id = npc.netID;
name = npc.FullName;
if (npc.modNPC != null)
{
mod = npc.modNPC.mod.Name;
}
}
}
public class NPCDropInfoUnifiedRandom : UnifiedRandom
{
public static int npcID = 0;
public static int LastMaxValue = 0;
public override int Next(int maxValue)
{
int result = base.Next(maxValue);
if (0 < Main.npc[npcID].type)
{
LastMaxValue = maxValue;
result = 0;
}
return result;
}
}
public class NPCDropInfoGlobalItem : GlobalItem
{
public static event Action<Item> OnSetDefaults = null;
public override void SetDefaults(Item item)
{
if (OnSetDefaults != null)
{
OnSetDefaults(item);
}
}
}
public static class NPCDropInfoUtils
{
public static void OutputDropInfo()
{
using (StreamWriter sw = new StreamWriter(new FileStream(NPCInfo.pathNPCDropInfo, FileMode.Create, FileAccess.Write, FileShare.ReadWrite), System.Text.Encoding.UTF8))
{
NPCInfoTool.listDropInfo = NPCDropInfoUtils.GetNPCDropInfoList();
sw.Write(JsonConvert.SerializeObject(NPCInfoTool.listDropInfo));
}
}
public static List<NPCDropInfo> GetNPCDropInfoList()
{
List<NPCDropInfo> result = new List<NPCDropInfo>();
var rand = Main.rand;
bool expertMode = Main.expertMode;
Main.rand = new LootUnifiedRandom();
Main.expertMode = false;
for (int netID = -65; netID < NPCLoader.NPCCount; netID++)
//int netID = 1;
{
NPC npc = new NPC();
npc.SetDefaults(netID);
for (int i = 0; i < 100; i++)
{
try
{
LootUnifiedRandom.NextLoop(i);
npc.NPCLoot();
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"{netID}: {ex.Message}");
}
}
var info = new NPCDropInfo(npc);
foreach (var a in LootUnifiedRandom.list)
{
foreach (var b in a.list.Where(x => 0 < x.items.Count))
{
var list = new DropItemList();
list.rate = b.maxValue;
list.expert = Main.expertMode;
foreach (var c in b.items)
{
if (!info.list.Any(x => x.items.Any(y => y.id == c.Value.netID)) && !list.items.Any(x => x.id == c.Value.netID))
list.items.Add(new DropItem(c.Value));
}
if (0 < list.items.Count)
{
info.list.Add(list);
}
}
}
if (0 < info.list.Count)
{
result.Add(info);
}
}
Main.rand = rand;
Main.expertMode = expertMode;
return result;
}
}
}