Files
CustomNPC-Plus/src/main/java/noppes/npcs/controllers/CustomEffectController.java
T

661 lines
23 KiB
Java
Raw Normal View History

2025-02-10 14:58:45 -05:00
package noppes.npcs.controllers;
2025-02-10 16:38:50 -05:00
import kamkeel.npcs.controllers.SyncController;
import kamkeel.npcs.network.enums.EnumSyncType;
2025-02-10 14:58:45 -05:00
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import noppes.npcs.CustomNpcs;
import noppes.npcs.LogWriter;
import noppes.npcs.NoppesUtilServer;
import noppes.npcs.api.entity.IPlayer;
2025-02-10 17:24:26 -05:00
import noppes.npcs.api.handler.ICustomEffectHandler;
2025-02-10 14:58:45 -05:00
import noppes.npcs.api.handler.data.ICustomEffect;
import noppes.npcs.controllers.data.CustomEffect;
2025-02-10 17:19:58 -05:00
import noppes.npcs.controllers.data.EffectKey;
2025-02-11 13:56:28 -05:00
import noppes.npcs.controllers.data.EffectScript;
2025-02-10 14:58:45 -05:00
import noppes.npcs.controllers.data.PlayerEffect;
import noppes.npcs.util.NBTJsonUtil;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.zip.GZIPInputStream;
import static noppes.npcs.scripted.event.PlayerEvent.EffectEvent.ExpirationType;
2025-02-10 17:24:26 -05:00
public class CustomEffectController implements ICustomEffectHandler {
2025-02-10 14:58:45 -05:00
2025-02-10 17:24:26 -05:00
public static CustomEffectController Instance = new CustomEffectController();
2025-02-10 14:58:45 -05:00
public HashMap<Integer, HashMap<Integer, CustomEffect>> indexMapper = new HashMap<>();
public HashMap<Integer, CustomEffect> customEffectsSync = new HashMap<>();
2025-02-11 13:56:28 -05:00
public HashMap<Integer, EffectScript> customEffectScriptHandlers = new HashMap<>();
2025-02-10 14:58:45 -05:00
private HashMap<Integer, String> bootOrder;
private int lastUsedID = 0;
2025-02-10 21:41:54 -05:00
public ConcurrentHashMap<UUID, ConcurrentHashMap<EffectKey, PlayerEffect>> playerEffects = new ConcurrentHashMap<>();
2025-02-10 14:58:45 -05:00
2025-03-13 17:14:45 -04:00
public CustomEffectController() {
2025-02-12 03:15:28 -05:00
HashMap<Integer, CustomEffect> customEffects = new HashMap<>();
registerEffectMap(0, customEffects);
}
2025-02-10 14:58:45 -05:00
2025-02-10 17:24:26 -05:00
public static CustomEffectController getInstance() {
2025-02-10 14:58:45 -05:00
return Instance;
}
2025-02-10 18:33:05 -05:00
public <T extends CustomEffect> void registerEffectMap(int index, HashMap<Integer, T> effectHashMap) {
2025-02-12 03:15:28 -05:00
indexMapper.put(index, (HashMap<Integer, CustomEffect>) effectHashMap);
}
2025-03-13 17:14:45 -04:00
public HashMap<Integer, CustomEffect> getCustomEffects() {
2025-02-12 03:15:28 -05:00
return indexMapper.get(0);
2025-02-10 17:19:58 -05:00
}
2025-02-10 14:58:45 -05:00
public void load() {
lastUsedID = 0;
playerEffects.clear();
bootOrder = new HashMap<>();
LogWriter.info("Loading custom effects...");
readCustomEffectMap();
loadCustomEffects();
LogWriter.info("Done loading custom effects.");
}
public void runEffects(EntityPlayer player) {
2025-02-10 17:19:58 -05:00
Map<EffectKey, PlayerEffect> current = getPlayerEffects(player);
for (Map.Entry<EffectKey, PlayerEffect> entry : current.entrySet()) {
int id = entry.getKey().getId();
2025-02-10 18:56:54 -05:00
int index = entry.getKey().getIndex();
CustomEffect effect = get(id, index);
2025-02-10 14:58:45 -05:00
if (effect != null) {
2025-02-10 17:19:58 -05:00
effect.runEffect(player, entry.getValue());
2025-02-10 14:58:45 -05:00
}
}
}
public void killEffects(EntityPlayer player) {
2025-02-10 17:19:58 -05:00
Map<EffectKey, PlayerEffect> current = getPlayerEffects(player);
Iterator<Map.Entry<EffectKey, PlayerEffect>> iterator = current.entrySet().iterator();
2025-02-10 14:58:45 -05:00
while (iterator.hasNext()) {
2025-02-10 17:19:58 -05:00
Map.Entry<EffectKey, PlayerEffect> entry = iterator.next();
int id = entry.getKey().getId();
2025-02-10 18:56:54 -05:00
int index = entry.getKey().getIndex();
CustomEffect effect = get(id, index);
2025-02-10 14:58:45 -05:00
if (effect != null) {
if (effect.lossOnDeath) {
2025-02-10 17:19:58 -05:00
effect.onRemoved(player, entry.getValue(), ExpirationType.DEATH);
2025-02-10 14:58:45 -05:00
iterator.remove();
}
} else {
2025-02-10 17:19:58 -05:00
iterator.remove();
2025-02-10 14:58:45 -05:00
}
}
}
public void delete(int id) {
ICustomEffect effect = get(id);
if (effect != null) {
2025-02-12 03:15:28 -05:00
CustomEffect foundEffect = getCustomEffects().remove(effect.getID());
2025-02-10 14:58:45 -05:00
customEffectScriptHandlers.remove(effect.getID());
if (foundEffect != null && foundEffect.name != null) {
File dir = this.getDir();
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
2025-02-12 03:15:28 -05:00
if (file.getName().equalsIgnoreCase(foundEffect.name + ".json")) {
2025-02-10 14:58:45 -05:00
file.delete();
2025-02-10 16:38:50 -05:00
SyncController.syncRemove(EnumSyncType.CUSTOM_EFFECTS, foundEffect.getID());
2025-02-10 14:58:45 -05:00
break;
}
}
saveEffectLoadMap();
}
}
}
public int getUnusedId() {
2025-02-12 03:15:28 -05:00
for (int catid : getCustomEffects().keySet()) {
2025-02-10 14:58:45 -05:00
if (catid > lastUsedID)
lastUsedID = catid;
}
lastUsedID++;
return lastUsedID;
}
2025-02-10 18:12:58 -05:00
public CustomEffect get(int id, int index) {
HashMap<Integer, CustomEffect> effectMap = indexMapper.get(index);
return effectMap != null ? effectMap.get(id) : null;
}
public CustomEffect get(int id) {
return get(id, 0);
}
public boolean has(int id, int index) {
HashMap<Integer, CustomEffect> effectMap = indexMapper.get(index);
return effectMap != null && effectMap.containsKey(id);
}
public boolean has(int id) {
return has(id, 0);
}
public CustomEffect get(String name, int index) {
HashMap<Integer, CustomEffect> effectMap = indexMapper.get(index);
if (effectMap != null) {
for (CustomEffect effect : effectMap.values()) {
if (effect.getName().equalsIgnoreCase(name)) {
return effect;
}
2025-02-10 14:58:45 -05:00
}
}
return null;
}
2025-02-10 18:12:58 -05:00
public CustomEffect get(String name) {
return get(name, 0);
}
public boolean has(String name, int index) {
return get(name, index) != null;
}
public boolean has(String name) {
return has(name, 0);
2025-02-10 14:58:45 -05:00
}
2025-02-10 21:41:54 -05:00
public ConcurrentHashMap<EffectKey, PlayerEffect> getPlayerEffects(EntityPlayer player) {
2025-02-10 14:58:45 -05:00
UUID playerId = NoppesUtilServer.getUUID(player);
2025-02-10 21:41:54 -05:00
ConcurrentHashMap<EffectKey, PlayerEffect> effects = playerEffects.get(playerId);
2025-02-10 18:51:21 -05:00
if (effects == null) {
effects = new ConcurrentHashMap<>();
playerEffects.put(playerId, effects);
2025-02-10 14:58:45 -05:00
}
2025-02-10 18:51:21 -05:00
return effects;
2025-02-10 14:58:45 -05:00
}
public void removeEffect(EntityPlayer player, PlayerEffect effect, ExpirationType type) {
if (effect == null)
return;
2025-02-10 17:19:58 -05:00
Map<EffectKey, PlayerEffect> currentEffects = getPlayerEffects(player);
EffectKey key = new EffectKey(effect.id, effect.index);
if (currentEffects.containsKey(key)) {
2025-02-10 18:51:21 -05:00
CustomEffect parent = get(effect.id, effect.index);
2025-02-10 14:58:45 -05:00
if (parent != null) {
parent.onRemoved(player, effect, type);
}
2025-02-10 17:19:58 -05:00
currentEffects.remove(key);
2025-02-10 14:58:45 -05:00
}
}
2025-02-12 04:06:25 -05:00
private boolean hasOther(String name, int id) {
for (CustomEffect effect : getCustomEffects().values()) {
if (effect.getID() != id && effect.getName().equalsIgnoreCase(name))
return true;
}
return false;
}
2025-02-10 18:51:21 -05:00
public void clearEffects(EntityPlayer player) {
Map<EffectKey, PlayerEffect> effects = getPlayerEffects(player);
2025-02-10 14:58:45 -05:00
if (effects != null) {
effects.clear();
}
}
2025-02-10 18:51:21 -05:00
public void clearEffect(EntityPlayer player, int id) {
clearEffect(player, id, 0);
}
public void clearEffect(EntityPlayer player, int id, int index) {
Map<EffectKey, PlayerEffect> effects = getPlayerEffects(player);
if (effects != null) {
effects.remove(new EffectKey(id, index));
}
}
2025-02-10 14:58:45 -05:00
public boolean hasEffect(EntityPlayer player, int id) {
2025-02-10 17:19:58 -05:00
return hasEffect(player, id, 0);
}
2025-02-10 14:58:45 -05:00
2025-02-10 17:19:58 -05:00
public boolean hasEffect(EntityPlayer player, int id, int index) {
return getPlayerEffects(player).containsKey(new EffectKey(id, index));
2025-02-10 14:58:45 -05:00
}
public int getEffectDuration(EntityPlayer player, int id) {
2025-02-10 17:19:58 -05:00
return getEffectDuration(player, id, 0);
}
2025-02-10 14:58:45 -05:00
2025-02-10 17:19:58 -05:00
public int getEffectDuration(EntityPlayer player, int id, int index) {
PlayerEffect effect = getPlayerEffects(player).get(new EffectKey(id, index));
return effect != null ? effect.duration : -1;
2025-02-10 14:58:45 -05:00
}
public void applyEffect(EntityPlayer player, int id, int duration, byte level) {
2025-02-10 17:19:58 -05:00
applyEffect(player, id, duration, level, 0);
}
public void applyEffect(EntityPlayer player, int id, int duration, byte level, int index) {
2025-02-10 18:51:21 -05:00
if (player == null || id <= 0) return;
2025-02-10 17:19:58 -05:00
Map<EffectKey, PlayerEffect> currentEffects = getPlayerEffects(player);
2025-02-10 18:51:21 -05:00
CustomEffect parent = get(id, index);
2025-02-10 14:58:45 -05:00
if (parent != null) {
2025-02-12 01:46:42 -05:00
PlayerEffect playerEffect = new PlayerEffect(id, duration, level, index);
2025-02-10 17:19:58 -05:00
currentEffects.put(new EffectKey(id, index), playerEffect);
2025-02-10 14:58:45 -05:00
parent.onAdded(player, playerEffect);
}
}
2025-02-10 18:51:21 -05:00
public void removeEffect(EntityPlayer player, int id) {
removeEffect(player, id, 0, ExpirationType.REMOVED);
}
2025-02-10 14:58:45 -05:00
public void removeEffect(EntityPlayer player, int id, ExpirationType type) {
2025-02-10 17:19:58 -05:00
removeEffect(player, id, 0, type);
}
2025-02-10 18:51:21 -05:00
public void removeEffect(EntityPlayer player, int id, int index) {
removeEffect(player, id, index, ExpirationType.REMOVED);
}
2025-02-10 17:19:58 -05:00
public void removeEffect(EntityPlayer player, int id, int index, ExpirationType type) {
2025-02-10 18:51:21 -05:00
if (player == null || id <= 0) return;
2025-02-10 17:19:58 -05:00
Map<EffectKey, PlayerEffect> currentEffects = getPlayerEffects(player);
EffectKey key = new EffectKey(id, index);
PlayerEffect effect = currentEffects.get(key);
if (effect != null) {
this.removeEffect(player, effect, type);
2025-02-10 14:58:45 -05:00
}
}
public void decrementEffects(EntityPlayer player) {
Iterator<PlayerEffect> iterator = getPlayerEffects(player).values().iterator();
IPlayer iPlayer = NoppesUtilServer.getIPlayer(player);
while (iterator.hasNext()) {
PlayerEffect effect = iterator.next();
if (effect == null) {
iterator.remove();
continue;
}
if (effect.duration == -100)
continue;
if (effect.duration <= 0) {
2025-02-11 22:35:47 -05:00
CustomEffect parent = CustomEffectController.Instance.get(effect.id, effect.index);
2025-02-10 14:58:45 -05:00
if (parent != null) {
parent.onRemoved(player, effect, ExpirationType.RUN_OUT);
}
iterator.remove();
continue;
}
effect.duration--;
}
}
public File getMapDir() {
File dir = CustomNpcs.getWorldSaveDirectory();
if (!dir.exists())
dir.mkdir();
return dir;
}
private void loadCustomEffects() {
2025-02-12 03:15:28 -05:00
getCustomEffects().clear();
2025-02-10 14:58:45 -05:00
File dir = getDir();
if (!dir.exists()) {
dir.mkdir();
} else {
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
try {
CustomEffect effect = new CustomEffect();
effect.readFromNBT(NBTJsonUtil.LoadFile(file));
effect.name = file.getName().substring(0, file.getName().length() - 5);
if (effect.id == -1) {
effect.id = getUnusedId();
}
int originalID = effect.id;
int setID = effect.id;
2025-02-12 03:15:28 -05:00
while (bootOrder.containsKey(setID) || getCustomEffects().containsKey(setID)) {
2025-02-10 14:58:45 -05:00
if (bootOrder.containsKey(setID))
2025-02-12 03:15:28 -05:00
if (bootOrder.get(setID).equalsIgnoreCase(effect.name))
2025-02-10 14:58:45 -05:00
break;
setID++;
}
effect.id = setID;
if (originalID != setID) {
LogWriter.info("Found Custom Effect ID Mismatch: " + effect.name + ", New ID: " + setID);
effect.save();
}
2025-02-12 03:15:28 -05:00
getCustomEffects().put(effect.id, effect);
2025-02-10 14:58:45 -05:00
} catch (Exception e) {
LogWriter.error("Error loading: " + file.getAbsolutePath(), e);
}
}
}
2025-02-12 03:15:28 -05:00
this.registerEffectMap(0, getCustomEffects());
2025-02-10 14:58:45 -05:00
saveEffectLoadMap();
}
2025-03-13 17:14:45 -04:00
public HashMap<Integer, CustomEffect> getEffectMap(int index) {
if (indexMapper.containsKey(index)) {
2025-02-10 14:58:45 -05:00
return getEffectMap(index);
}
return null;
}
private File getDir() {
return new File(CustomNpcs.getWorldSaveDirectory(), "customeffects");
}
private void saveEffectLoadMap() {
try {
File saveDir = getMapDir();
File file = new File(saveDir, "customeffects.dat_new");
File file1 = new File(saveDir, "customeffects.dat_old");
File file2 = new File(saveDir, "customeffects.dat");
CompressedStreamTools.writeCompressed(this.writeMapNBT(), new FileOutputStream(file));
if (file1.exists()) {
file1.delete();
}
file2.renameTo(file1);
if (file2.exists()) {
file2.delete();
}
file.renameTo(file2);
if (file.exists()) {
file.delete();
}
} catch (Exception e) {
LogWriter.except(e);
}
}
private NBTTagCompound writeMapNBT() {
NBTTagCompound nbt = new NBTTagCompound();
2025-02-10 17:19:58 -05:00
NBTTagList customEffectsList = new NBTTagList();
2025-02-12 03:15:28 -05:00
for (Integer key : this.getCustomEffects().keySet()) {
CustomEffect customEffect = this.getCustomEffects().get(key);
2025-02-10 14:58:45 -05:00
if (!customEffect.getName().isEmpty()) {
NBTTagCompound effectCompound = new NBTTagCompound();
effectCompound.setString("Name", customEffect.getName());
effectCompound.setInteger("ID", key);
2025-02-10 17:19:58 -05:00
customEffectsList.appendTag(effectCompound);
2025-02-10 14:58:45 -05:00
}
}
2025-02-10 17:19:58 -05:00
nbt.setTag("CustomEffects", customEffectsList);
2025-02-10 14:58:45 -05:00
nbt.setInteger("lastID", lastUsedID);
return nbt;
}
private void readCustomEffectMap() {
bootOrder.clear();
try {
File file = new File(getMapDir(), "customeffects.dat");
if (file.exists()) {
loadCustomEffectMap(file);
}
} catch (Exception e) {
try {
File file = new File(getMapDir(), "customeffects.dat_old");
if (file.exists()) {
loadCustomEffectMap(file);
}
2025-03-13 17:14:45 -04:00
} catch (Exception ignored) {
}
2025-02-10 14:58:45 -05:00
}
}
private void loadCustomEffectMap(File file) throws IOException {
2025-02-10 17:19:58 -05:00
DataInputStream dis = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));
readCustomEffectMap(dis);
dis.close();
2025-02-10 14:58:45 -05:00
}
private void readCustomEffectMap(DataInputStream stream) throws IOException {
NBTTagCompound nbtCompound = CompressedStreamTools.read(stream);
this.readMapNBT(nbtCompound);
}
private void readMapNBT(NBTTagCompound compound) {
lastUsedID = compound.getInteger("lastID");
NBTTagList list = compound.getTagList("CustomEffects", 10);
if (list != null) {
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound nbttagcompound = list.getCompoundTagAt(i);
String effectName = nbttagcompound.getString("Name");
Integer key = nbttagcompound.getInteger("ID");
bootOrder.put(key, effectName);
}
}
}
public void deleteEffectFile(String prevName) {
File dir = this.getDir();
if (!dir.exists())
dir.mkdirs();
File file2 = new File(dir, prevName + ".json");
if (file2.exists())
file2.delete();
}
2025-03-11 20:25:00 -04:00
// API Versions
@Override
public ICustomEffect createEffect(String name) {
if (has(name))
return get(name);
CustomEffect effect = new CustomEffect();
effect.name = name;
if (effect.id == -1) {
int id = getUnusedId();
while (getCustomEffects().containsKey(id)) {
id = getUnusedId();
}
effect.id = id;
}
getCustomEffects().put(effect.id, effect);
return effect;
}
@Override
public ICustomEffect getEffect(String name) {
return get(name);
}
@Override
public void deleteEffect(String name) {
ICustomEffect effect = getEffect(name);
if (effect != null) {
CustomEffect foundEffect = getCustomEffects().remove(effect.getID());
customEffectScriptHandlers.remove(effect.getID());
if (foundEffect != null && foundEffect.name != null) {
File dir = this.getDir();
for (File file : dir.listFiles()) {
if (!file.isFile() || !file.getName().endsWith(".json"))
continue;
if (file.getName().equalsIgnoreCase(foundEffect.name + ".json")) {
file.delete();
SyncController.syncRemove(EnumSyncType.CUSTOM_EFFECTS, foundEffect.getID());
break;
}
}
saveEffectLoadMap();
}
}
}
@Override
public boolean hasEffect(IPlayer player, int id) {
if (player == null || player.getMCEntity() == null)
return false;
return hasEffect((EntityPlayer) player.getMCEntity(), id);
}
@Override
public boolean hasEffect(IPlayer player, ICustomEffect effect) {
2025-03-25 11:12:53 -04:00
if (player == null || player.getMCEntity() == null)
return false;
return hasEffect((EntityPlayer) player.getMCEntity(), effect.getID(), effect.getIndex()));
2025-03-11 20:25:00 -04:00
}
@Override
public int getEffectDuration(IPlayer player, int id) {
if (player == null || player.getMCEntity() == null)
return -1;
return getEffectDuration((EntityPlayer) player.getMCEntity(), id);
}
@Override
public int getEffectDuration(IPlayer player, ICustomEffect effect) {
2025-03-13 19:55:35 -04:00
if(effect == null)
return -1;
return getEffectDuration(player, effect.getID(), effect.getIndex());
2025-03-11 20:25:00 -04:00
}
@Override
public void applyEffect(IPlayer player, int id, int duration, byte level) {
if (player == null || player.getMCEntity() == null)
return;
applyEffect((EntityPlayer) player.getMCEntity(), id, duration, level);
}
@Override
public void applyEffect(IPlayer player, ICustomEffect effect, int duration, byte level) {
applyEffect(player, effect.getID(), duration, level);
}
@Override
public void removeEffect(IPlayer player, int id) {
if (player == null || player.getMCEntity() == null)
return;
removeEffect((EntityPlayer) player.getMCEntity(), id, ExpirationType.REMOVED);
}
@Override
public void removeEffect(IPlayer player, ICustomEffect effect) {
removeEffect((EntityPlayer) player.getMCEntity(), (PlayerEffect) effect, ExpirationType.REMOVED);
}
@Override
public void clearEffects(IPlayer player) {
if (player == null || player.getMCEntity() == null)
return;
clearEffects((EntityPlayer) player);
}
@Override
public void applyEffect(IPlayer player, int id, int duration, byte level, int index) {
if (player == null || player.getMCEntity() == null)
return;
applyEffect((EntityPlayer) player.getMCEntity(), id, duration, level, index);
}
@Override
public void applyEffect(IPlayer player, ICustomEffect effect, int duration, byte level, int index) {
applyEffect(player, effect.getID(), duration, level, index);
}
@Override
public void removeEffect(IPlayer player, int id, int index) {
if (player == null || player.getMCEntity() == null)
return;
removeEffect((EntityPlayer) player.getMCEntity(), id, index, ExpirationType.REMOVED);
}
@Override
public void removeEffect(IPlayer player, ICustomEffect effect, int index) {
removeEffect(player, effect.getID(), index);
}
@Override
public void clearEffects(IPlayer player, int index) {
if (player == null || player.getMCEntity() == null)
return;
EntityPlayer entity = (EntityPlayer) player.getMCEntity();
ConcurrentHashMap<EffectKey, PlayerEffect> effects = getPlayerEffects(entity);
Iterator<Map.Entry<EffectKey, PlayerEffect>> iterator = effects.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<EffectKey, PlayerEffect> entry = iterator.next();
if (entry.getKey().getIndex() == index) {
CustomEffect parent = get(entry.getKey().getId(), index);
if (parent != null) {
parent.onRemoved(entity, entry.getValue(), ExpirationType.REMOVED);
}
iterator.remove();
}
}
}
@Override
public int getEffectDuration(IPlayer player, int id, int index) {
if (player == null || player.getMCEntity() == null)
return -1;
return getEffectDuration((EntityPlayer) player.getMCEntity(), id, index);
}
@Override
public int getEffectDuration(IPlayer player, ICustomEffect effect, int index) {
return getEffectDuration(player, effect.getID(), index);
}
@Override
public ICustomEffect getEffect(String name, int index) {
return get(name, index);
}
@Override
public ICustomEffect getEffect(int id, int index) {
return get(id, index);
}
@Override
public ICustomEffect saveEffect(ICustomEffect customEffect) {
if (customEffect.getID() < 0) {
customEffect.setID(getUnusedId());
while (has(customEffect.getName()))
customEffect.setName(customEffect.getName() + "_");
}
while (hasOther(customEffect.getName(), customEffect.getID()))
customEffect.setName(customEffect.getName() + "_");
getCustomEffects().remove(customEffect.getID());
getCustomEffects().put(customEffect.getID(), (CustomEffect) customEffect);
saveEffectLoadMap();
File dir = this.getDir();
if (!dir.exists())
dir.mkdirs();
File file = new File(dir, customEffect.getName() + ".json_new");
File file2 = new File(dir, customEffect.getName() + ".json");
try {
NBTTagCompound nbtTagCompound = ((CustomEffect) customEffect).writeToNBT(true);
NBTJsonUtil.SaveFile(file, nbtTagCompound);
if (file2.exists())
file2.delete();
file.renameTo(file2);
nbtTagCompound.removeTag("ScriptData");
SyncController.syncUpdate(EnumSyncType.CUSTOM_EFFECTS, -1, nbtTagCompound);
} catch (Exception e) {
LogWriter.except(e);
}
return getCustomEffects().get(customEffect.getID());
}
2025-02-10 14:58:45 -05:00
}