ModUtilities.java
4.37 KB
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
package com.mumfrey.liteloader.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import com.mumfrey.liteloader.core.LiteLoader;
import net.minecraft.client.ClientBrandRetriever;
import net.minecraft.src.Minecraft;
import net.minecraft.src.*;
public abstract class ModUtilities
{
/**
* Collection of packets we have already overridden, so that duplicate registrations can generate a warning
*/
private static Set<Integer> overriddenPackets = new HashSet<Integer>();
/**
* True if FML is being used, in which case we use searge names instead of raw field/method names
*/
private static boolean forgeModLoader = false;
static
{
// Check for FML
forgeModLoader = ClientBrandRetriever.getClientModName().contains("fml");
}
/**
* Add a renderer map entry for the specified entity class
*
* @param entityClass
* @param renderer
*/
@SuppressWarnings("unchecked")
public static void addRenderer(Class<? extends Entity> entityClass, Render renderer)
{
Map<Class<? extends Entity>, Render> entityRenderMap = PrivateFields.entityRenderMap.get(RenderManager.instance);
entityRenderMap.put(entityClass, renderer);
renderer.setRenderManager(RenderManager.instance);
}
/**
* Register a packet override
*
* @param packetId
* @param newPacket
*/
@SuppressWarnings("unchecked")
public static boolean registerPacketOverride(int packetId, Class<? extends Packet> newPacket)
{
if (overriddenPackets.contains(Integer.valueOf(packetId)))
{
LiteLoader.getLogger().warning(String.format("Packet with ID %s was already overridden by another mod, one or mods may not function correctly", packetId));
}
try
{
IntHashMap packetIdToClassMap = Packet.packetIdToClassMap;
PrivateFields.StaticFields.packetClassToIdMap.get();
Map<Class<? extends Packet>, Integer> packetClassToIdMap = PrivateFields.StaticFields.packetClassToIdMap.get();
packetIdToClassMap.removeObject(packetId);
packetIdToClassMap.addKey(packetId, newPacket);
packetClassToIdMap.put(newPacket, Integer.valueOf(packetId));
return true;
}
catch (Exception ex)
{
LiteLoader.logger.warning("Error registering packet override for packet id " + packetId + ": " + ex.getMessage());
return false;
}
}
/**
* Send a plugin channel (custom payload) packet to the server
*
* @param channel Channel to send the data
* @param data
*/
public static void sendPluginChannelMessage(String channel, byte[] data)
{
if (channel == null || channel.length() > 16)
throw new RuntimeException("Invalid channel name specified");
try
{
Minecraft minecraft = Minecraft.getMinecraft();
if (minecraft.thePlayer != null)
{
Packet250CustomPayload payload = new Packet250CustomPayload(channel, data);
minecraft.thePlayer.sendQueue.addToSendQueue(payload);
}
}
catch (Exception ex) {}
}
/**
* Abstraction helper function
*
* @param fieldName Name of field to get, returned unmodified if in debug mode
* @return Obfuscated field name if present
*/
public static String getObfuscatedFieldName(String fieldName, String obfuscatedFieldName, String seargeFieldName)
{
if (forgeModLoader) return seargeFieldName;
return !net.minecraft.src.Tessellator.instance.getClass().getSimpleName().equals("Tessellator") ? obfuscatedFieldName : fieldName;
}
/**
* Registers a keybind with the game settings class so that it is configurable in the "controls" screen
*
* @param newBinding key binding to add
*/
public static void registerKey(KeyBinding newBinding)
{
LiteLoader.getInstance().registerModKey(newBinding);
}
/**
* Unregisters a registered keybind with the game settings class, thus removing it from the "controls" screen
*
* @param removeBinding
*/
public static void unRegisterKey(KeyBinding removeBinding)
{
Minecraft mc = Minecraft.getMinecraft();
if (mc == null || mc.gameSettings == null) return;
LinkedList<KeyBinding> keyBindings = new LinkedList<KeyBinding>();
keyBindings.addAll(Arrays.asList(mc.gameSettings.keyBindings));
if (keyBindings.contains(removeBinding))
{
keyBindings.remove(removeBinding);
mc.gameSettings.keyBindings = keyBindings.toArray(new KeyBinding[0]);
}
}
}