-
Notifications
You must be signed in to change notification settings - Fork 497
/
InterModComms.java
130 lines (116 loc) · 5.47 KB
/
InterModComms.java
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
/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents
* of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */
package buildcraft.core;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCEvent;
import net.minecraftforge.fml.common.event.FMLInterModComms.IMCMessage;
import buildcraft.api.core.BCLog;
import buildcraft.core.recipes.AssemblyRecipeManager;
import buildcraft.core.recipes.RefineryRecipeManager;
public final class InterModComms {
private static final Set<IMCHandler> handlers = new HashSet<>();
/** Deactivate constructor */
private InterModComms() {}
public static void registerHandler(IMCHandler handler) {
handlers.add(handler);
}
public static void processIMC(IMCEvent event) {
for (IMCMessage m : event.getMessages()) {
if (m.key.equals("add-assembly-recipe")) {
processAssemblyRecipeAddIMC(event, m);
} else if (m.key.equals("add-refinery-recipe")) {
processRefineryRecipeAddIMC(event, m);
} else if (m.key.equals("remove-assembly-recipe")) {
processAssemblyRecipeRemoveIMC(event, m);
} else if (m.key.equals("remove-refinery-recipe")) {
processRefineryRecipeRemoveIMC(event, m);
} else {
for (IMCHandler h : handlers) {
h.processIMCEvent(event, m);
}
}
}
}
public static void processAssemblyRecipeRemoveIMC(IMCEvent event, IMCMessage msg) {
if (msg.isStringMessage()) {
AssemblyRecipeManager.INSTANCE.removeRecipe(msg.getStringValue());
BCLog.logger.info(String.format("Received an assembly recipe '%s' removal request from mod %s", msg.getStringValue(), msg.getSender()));
}
}
public static void processRefineryRecipeRemoveIMC(IMCEvent event, IMCMessage msg) {
if (msg.isStringMessage()) {
RefineryRecipeManager.INSTANCE.removeRecipe(msg.getStringValue());
BCLog.logger.info(String.format("Received a refinery recipe '%s' removal request from mod %s", msg.getStringValue(), msg.getSender()));
}
}
public static void processAssemblyRecipeAddIMC(IMCEvent event, IMCMessage msg) {
boolean failed = false;
if (!msg.isNBTMessage()) {
failed = true;
} else {
NBTTagCompound recipe = msg.getNBTValue();
if (!recipe.hasKey("id") || !recipe.hasKey("input", 9) || !recipe.hasKey("output", 10) || !recipe.hasKey("energy", 3)) { // Ints
// -
// NBTBase#NBTTypes
failed = true;
} else {
NBTTagList list = (NBTTagList) recipe.getTag("input");
List<ItemStack> input = new ArrayList<>();
for (int i = 0; i < list.tagCount(); i++) {
ItemStack is = ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(i));
if (is != null) {
input.add(is);
}
}
String id = recipe.getString("id");
ItemStack is = ItemStack.loadItemStackFromNBT(recipe.getCompoundTag("output"));
if (is != null && !input.isEmpty() && id.length() > 0) {
AssemblyRecipeManager.INSTANCE.addRecipe(id, recipe.getInteger("energy"), is, (Object[]) input.toArray(new ItemStack[input
.size()]));
} else {
failed = true;
}
}
}
if (failed) {
BCLog.logger.warn("Received invalid assembly recipe IMC message from mod %s!", msg.getSender());
}
}
public static void processRefineryRecipeAddIMC(IMCEvent event, IMCMessage msg) {
boolean failed = false;
if (!msg.isNBTMessage()) {
failed = true;
} else {
NBTTagCompound recipe = msg.getNBTValue();
if (!recipe.hasKey("id") && !recipe.hasKey("input", 10) || !recipe.hasKey("output", 10) || !recipe.hasKey("energy", 3) || !recipe.hasKey(
"delay", 3)) {
failed = true;
} else {
FluidStack output = FluidStack.loadFluidStackFromNBT(recipe.getCompoundTag("output"));
FluidStack input = FluidStack.loadFluidStackFromNBT(recipe.getCompoundTag("input"));
FluidStack input2 = null;
String id = recipe.getString("id");
if (recipe.hasKey("input_2", 10)) {
input2 = FluidStack.loadFluidStackFromNBT(recipe.getCompoundTag("input_2"));
}
if (input != null && output != null && id.length() > 0) {
RefineryRecipeManager.INSTANCE.addRecipe(id, input, input2, output, recipe.getInteger("energy"), recipe.getInteger("delay"));
} else {
failed = true;
}
}
}
if (failed) {
BCLog.logger.warn("Received invalid refinery recipe IMC message from mod %s!", msg.getSender());
}
}
}