added access & save api from core machine
This commit is contained in:
parent
c3d6626cdd
commit
fbfcd89d95
11 changed files with 1296 additions and 0 deletions
132
src/dark/api/access/AccessGroup.java
Normal file
132
src/dark/api/access/AccessGroup.java
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
|
||||||
|
import com.builtbroken.common.Group;
|
||||||
|
|
||||||
|
/** Used by a terminal to track what users are part of each group. As well used to setup access
|
||||||
|
* points to the terminal.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public class AccessGroup extends Group<AccessUser>
|
||||||
|
{
|
||||||
|
protected List<String> nodes = new ArrayList<String>();
|
||||||
|
protected AccessGroup extendGroup;
|
||||||
|
|
||||||
|
public AccessGroup(String name, AccessUser... js)
|
||||||
|
{
|
||||||
|
super(name, js);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setToExtend(AccessGroup group)
|
||||||
|
{
|
||||||
|
this.extendGroup = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addMemeber(AccessUser obj)
|
||||||
|
{
|
||||||
|
if (obj != null)
|
||||||
|
{
|
||||||
|
for (AccessUser user : this.memebers)
|
||||||
|
{
|
||||||
|
if (user.getName().equalsIgnoreCase(obj.getName()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (super.addMemeber(obj))
|
||||||
|
{
|
||||||
|
obj.setGroup(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessUser getMember(String name)
|
||||||
|
{
|
||||||
|
for (AccessUser user : this.memebers)
|
||||||
|
{
|
||||||
|
if (user.getName().equalsIgnoreCase(name))
|
||||||
|
{
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NBTTagCompound save(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
nbt.setString("groupName", this.getName());
|
||||||
|
NBTTagList usersTag = new NBTTagList();
|
||||||
|
for (AccessUser user : this.memebers)
|
||||||
|
{
|
||||||
|
if (!user.isTempary)
|
||||||
|
{
|
||||||
|
NBTTagCompound accessData = new NBTTagCompound();
|
||||||
|
user.save(accessData);
|
||||||
|
usersTag.appendTag(accessData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nbt.setTag("users", usersTag);
|
||||||
|
NBTTagList nodesTag = new NBTTagList();
|
||||||
|
for (String str : this.nodes)
|
||||||
|
{
|
||||||
|
NBTTagCompound accessData = new NBTTagCompound();
|
||||||
|
accessData.setString("name", str);
|
||||||
|
nodesTag.appendTag(accessData);
|
||||||
|
}
|
||||||
|
nbt.setTag("nodes", nodesTag);
|
||||||
|
return nbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void load(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
this.setName(nbt.getString("groupName"));
|
||||||
|
NBTTagList userList = nbt.getTagList("users");
|
||||||
|
for (int i = 0; i < userList.tagCount(); ++i)
|
||||||
|
{
|
||||||
|
this.addMemeber(AccessUser.loadFromNBT((NBTTagCompound) userList.tagAt(i)));
|
||||||
|
}
|
||||||
|
NBTTagList nodeList = nbt.getTagList("nodes");
|
||||||
|
for (int i = 0; i < nodeList.tagCount(); ++i)
|
||||||
|
{
|
||||||
|
this.nodes.add(((NBTTagCompound) nodeList.tagAt(i)).getString("name"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNode(String node)
|
||||||
|
{
|
||||||
|
return this.nodes.contains(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addNode(String node)
|
||||||
|
{
|
||||||
|
this.nodes.add(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeNode(String node)
|
||||||
|
{
|
||||||
|
if (this.nodes.contains(node))
|
||||||
|
{
|
||||||
|
this.nodes.remove(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isMemeber(String string)
|
||||||
|
{
|
||||||
|
for (AccessUser user : this.memebers)
|
||||||
|
{
|
||||||
|
if (user.getName().equalsIgnoreCase(string))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
280
src/dark/api/access/AccessProfile.java
Normal file
280
src/dark/api/access/AccessProfile.java
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import dark.api.save.IVirtualObject;
|
||||||
|
import dark.api.save.NBTFileHelper;
|
||||||
|
import dark.api.save.SaveManager;
|
||||||
|
|
||||||
|
/** Designed to be used as a container for AccessGroups and AccessUser. If you plan to use this make
|
||||||
|
* sure to use it correctly. This is designed to be saved separate from the world save if marked for
|
||||||
|
* global access. Which means it can save/load at will from the world file.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public class AccessProfile implements ISpecialAccess, IVirtualObject
|
||||||
|
{
|
||||||
|
/** A list of user access data. */
|
||||||
|
protected List<AccessGroup> groups = new ArrayList<AccessGroup>();
|
||||||
|
/** Display name */
|
||||||
|
protected String profileName = "";
|
||||||
|
/** Only used by global profiles that have no defined container. Also LocalHost means it was
|
||||||
|
* created by a tileEntity */
|
||||||
|
protected String profileID = "LocalHost";
|
||||||
|
/** Is this profile global */
|
||||||
|
protected boolean global = false;
|
||||||
|
/** Save file by which this was loaded from. Mainly used to save it in the same location again. */
|
||||||
|
protected File saveFile;
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
SaveManager.registerClass("AccessProfile", AccessProfile.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessProfile()
|
||||||
|
{
|
||||||
|
if (global)
|
||||||
|
{
|
||||||
|
SaveManager.register(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessProfile(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
this(nbt, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessProfile(NBTTagCompound nbt, boolean global)
|
||||||
|
{
|
||||||
|
this();
|
||||||
|
this.load(nbt);
|
||||||
|
if (this.profileName == null || this.profileID == null)
|
||||||
|
{
|
||||||
|
if (!global)
|
||||||
|
{
|
||||||
|
this.generateNew("Default", null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.generateNew("New Group", "global");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessProfile generateNew(String name, Object object)
|
||||||
|
{
|
||||||
|
GroupRegistry.loadNewGroupSet(this);
|
||||||
|
this.profileName = name;
|
||||||
|
name.replaceAll(" ", "");
|
||||||
|
String id = null;
|
||||||
|
// Created by player for personal use
|
||||||
|
if (object instanceof EntityPlayer)
|
||||||
|
{
|
||||||
|
id = ((EntityPlayer) object).username + "_" + System.currentTimeMillis();
|
||||||
|
}//Created by a tile
|
||||||
|
else if (object instanceof TileEntity || object == null)
|
||||||
|
{
|
||||||
|
id = "LocalHost:" + name;
|
||||||
|
}//created by the game or player for global use
|
||||||
|
else if (object instanceof String && ((String) object).equalsIgnoreCase("global"))
|
||||||
|
{
|
||||||
|
id = "P_" + name + "_" + System.currentTimeMillis();
|
||||||
|
this.global = true;
|
||||||
|
}
|
||||||
|
this.profileID = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return this.profileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getID()
|
||||||
|
{
|
||||||
|
return this.profileID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGlobal()
|
||||||
|
{
|
||||||
|
return this.global;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessUser getUserAccess(String username)
|
||||||
|
{
|
||||||
|
for (AccessGroup group : this.groups)
|
||||||
|
{
|
||||||
|
AccessUser user = group.getMember(username);
|
||||||
|
if (user != null)
|
||||||
|
{
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new AccessUser(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AccessUser> getUsers()
|
||||||
|
{
|
||||||
|
List<AccessUser> users = new ArrayList<AccessUser>();
|
||||||
|
for (AccessGroup group : this.groups)
|
||||||
|
{
|
||||||
|
users.addAll(group.getMembers());
|
||||||
|
}
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setUserAccess(String player, AccessGroup g, boolean save)
|
||||||
|
{
|
||||||
|
return setUserAccess(new AccessUser(player).setTempary(save), g);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean setUserAccess(AccessUser user, AccessGroup group)
|
||||||
|
{
|
||||||
|
boolean bool = false;
|
||||||
|
|
||||||
|
if (user != null && user.getName() != null)
|
||||||
|
{
|
||||||
|
bool = this.removeUserAccess(user.getName()) && group == null;
|
||||||
|
if (group != null)
|
||||||
|
{
|
||||||
|
bool = group.addMemeber(user);
|
||||||
|
}
|
||||||
|
if (bool)
|
||||||
|
{
|
||||||
|
this.onProfileUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeUserAccess(String player)
|
||||||
|
{
|
||||||
|
boolean re = false;
|
||||||
|
for (AccessGroup group : this.groups)
|
||||||
|
{
|
||||||
|
AccessUser user = group.getMember(player);
|
||||||
|
if (user != null && group.removeMemeber(user))
|
||||||
|
{
|
||||||
|
re = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (re)
|
||||||
|
{
|
||||||
|
this.onProfileUpdate();
|
||||||
|
}
|
||||||
|
return re;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onProfileUpdate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessGroup getGroup(String name)
|
||||||
|
{
|
||||||
|
for (AccessGroup group : this.getGroups())
|
||||||
|
{
|
||||||
|
if (group.getName().equalsIgnoreCase(name))
|
||||||
|
{
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean addGroup(AccessGroup group)
|
||||||
|
{
|
||||||
|
if (!this.groups.contains(group))
|
||||||
|
{
|
||||||
|
for (AccessGroup g : this.groups)
|
||||||
|
{
|
||||||
|
if (group.getName().equalsIgnoreCase(g.getName()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.groups.add(group))
|
||||||
|
{
|
||||||
|
this.onProfileUpdate();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessGroup getOwnerGroup()
|
||||||
|
{
|
||||||
|
return this.getGroup("owner");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AccessGroup> getGroups()
|
||||||
|
{
|
||||||
|
if (this.groups == null || this.groups.isEmpty())
|
||||||
|
{
|
||||||
|
GroupRegistry.loadNewGroupSet(this);
|
||||||
|
}
|
||||||
|
return this.groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
this.profileName = nbt.getString("name");
|
||||||
|
this.global = nbt.getBoolean("global");
|
||||||
|
NBTTagList userList = nbt.getTagList("groups");
|
||||||
|
if (userList != null && userList.tagCount() > 0)
|
||||||
|
{
|
||||||
|
this.groups.clear();
|
||||||
|
for (int i = 0; i < userList.tagCount(); i++)
|
||||||
|
{
|
||||||
|
AccessGroup group = new AccessGroup("");
|
||||||
|
group.load((NBTTagCompound) userList.tagAt(i));
|
||||||
|
this.groups.add(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void load(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
nbt.setString("name", this.profileName);
|
||||||
|
nbt.setBoolean("global", this.global);
|
||||||
|
NBTTagList usersTag = new NBTTagList();
|
||||||
|
for (AccessGroup group : this.getGroups())
|
||||||
|
{
|
||||||
|
usersTag.appendTag(group.save(new NBTTagCompound()));
|
||||||
|
}
|
||||||
|
nbt.setTag("groups", usersTag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getSaveFile()
|
||||||
|
{
|
||||||
|
if (this.saveFile == null)
|
||||||
|
{
|
||||||
|
this.saveFile = new File(NBTFileHelper.getWorldSaveDirectory(MinecraftServer.getServer().getFolderName()), "CoreMachine/Access/" + this.getID() + ".dat");
|
||||||
|
}
|
||||||
|
return this.saveFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setSaveFile(File file)
|
||||||
|
{
|
||||||
|
this.saveFile = file;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
100
src/dark/api/access/AccessUser.java
Normal file
100
src/dark/api/access/AccessUser.java
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
|
||||||
|
import com.builtbroken.common.User;
|
||||||
|
|
||||||
|
/** Used to define a users access to a terminal based object.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public class AccessUser extends User
|
||||||
|
{
|
||||||
|
protected boolean isTempary = false;
|
||||||
|
protected NBTTagCompound extraData;
|
||||||
|
protected AccessGroup group;
|
||||||
|
protected List<String> nodes = new ArrayList<String>();
|
||||||
|
|
||||||
|
public AccessUser(String username)
|
||||||
|
{
|
||||||
|
super(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessUser(EntityPlayer player)
|
||||||
|
{
|
||||||
|
super(player.username);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessGroup getGroup()
|
||||||
|
{
|
||||||
|
return this.group;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessUser setGroup(AccessGroup group)
|
||||||
|
{
|
||||||
|
this.group = group;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasNode(String node)
|
||||||
|
{
|
||||||
|
if (group != null && group.hasNode(node))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return nodes.contains(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NBTTagCompound save(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
nbt.setString("username", this.username);
|
||||||
|
nbt.setCompoundTag("extraData", this.userData());
|
||||||
|
NBTTagList usersTag = new NBTTagList();
|
||||||
|
for (String str : this.nodes)
|
||||||
|
{
|
||||||
|
NBTTagCompound accessData = new NBTTagCompound();
|
||||||
|
accessData.setString("name", str);
|
||||||
|
usersTag.appendTag(accessData);
|
||||||
|
}
|
||||||
|
nbt.setTag("nodes", usersTag);
|
||||||
|
return nbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessUser load(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
this.username = nbt.getString("username");
|
||||||
|
this.extraData = nbt.getCompoundTag("extraData");
|
||||||
|
NBTTagList userList = nbt.getTagList("nodes");
|
||||||
|
for (int i = 0; i < userList.tagCount(); ++i)
|
||||||
|
{
|
||||||
|
this.nodes.add(((NBTTagCompound) userList.tagAt(i)).getString("name"));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessUser loadFromNBT(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
return new AccessUser("").load(nbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccessUser setTempary(boolean si)
|
||||||
|
{
|
||||||
|
this.isTempary = si;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used to add other data to the user */
|
||||||
|
public NBTTagCompound userData()
|
||||||
|
{
|
||||||
|
if (this.extraData == null)
|
||||||
|
{
|
||||||
|
this.extraData = new NBTTagCompound();
|
||||||
|
}
|
||||||
|
return this.extraData;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
114
src/dark/api/access/GroupRegistry.java
Normal file
114
src/dark/api/access/GroupRegistry.java
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
/** @author DarkGuardsman */
|
||||||
|
public class GroupRegistry
|
||||||
|
{
|
||||||
|
public static final List<String> nodes = new ArrayList<String>();
|
||||||
|
public static final HashMap<String, List<String>> groupDefaultNodes = new HashMap();
|
||||||
|
public static final HashMap<String, String> groupDefaultExtends = new HashMap();
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
//Owner group defaults
|
||||||
|
list.add(Nodes.GROUP_OWNER_NODE);
|
||||||
|
list.add(Nodes.INV_DISABLE_NODE);
|
||||||
|
list.add(Nodes.INV_ENABLE_NODE);
|
||||||
|
createDefaultGroup("owner", "admin", list);
|
||||||
|
//Admin group defaults
|
||||||
|
List<String> list2 = new ArrayList<String>();
|
||||||
|
list2.add(Nodes.GROUP_ADMIN_NODE);
|
||||||
|
list2.add(Nodes.INV_EDIT_NODE);
|
||||||
|
list2.add(Nodes.INV_LOCK_NODE);
|
||||||
|
list2.add(Nodes.INV_UNLOCK_NODE);
|
||||||
|
list2.add(Nodes.INV_CHANGE_NODE);
|
||||||
|
createDefaultGroup("admin", "user", list2);
|
||||||
|
//User group defaults
|
||||||
|
List<String> list3 = new ArrayList<String>();
|
||||||
|
list3.add(Nodes.GROUP_USER_NODE);
|
||||||
|
list3.add(Nodes.INV_OPEN_NODE);
|
||||||
|
list3.add(Nodes.INV_TAKE_NODE);
|
||||||
|
list3.add(Nodes.INV_GIVE_NODE);
|
||||||
|
createDefaultGroup("user", null, list3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a default group for all machines to use. Only add a group if there is no option to
|
||||||
|
* really manage the group's settings
|
||||||
|
*
|
||||||
|
* @param name - group name
|
||||||
|
* @param prefabGroup - group this should extend. Make sure it exists.
|
||||||
|
* @param nodes - all commands or custom nodes */
|
||||||
|
public static void createDefaultGroup(String name, String prefabGroup, List<String> nodes)
|
||||||
|
{
|
||||||
|
if (name != null)
|
||||||
|
{
|
||||||
|
groupDefaultNodes.put(name, nodes);
|
||||||
|
groupDefaultExtends.put(name, prefabGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates a default group for all machines to use. Only add a group if there is no option to
|
||||||
|
* really manage the group's settings
|
||||||
|
*
|
||||||
|
* @param name - group name
|
||||||
|
* @param prefabGroup - group this should extend. Make sure it exists.
|
||||||
|
* @param nodes - all commands or custom nodes */
|
||||||
|
public static void createDefaultGroup(String name, String prefabGroup, String... nodes)
|
||||||
|
{
|
||||||
|
List<String> nodeList = new ArrayList<String>();
|
||||||
|
if (nodes != null)
|
||||||
|
{
|
||||||
|
for (String node : nodes)
|
||||||
|
{
|
||||||
|
nodeList.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
createDefaultGroup(name, prefabGroup, nodeList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Builds a new default group list for a basic machine */
|
||||||
|
public static List<AccessGroup> getNewGroupSet()
|
||||||
|
{
|
||||||
|
List<AccessGroup> groups = new ArrayList<AccessGroup>();
|
||||||
|
for (Entry<String, List<String>> entry : groupDefaultNodes.entrySet())
|
||||||
|
{
|
||||||
|
AccessGroup group = new AccessGroup(entry.getKey());
|
||||||
|
if (entry.getValue() != null)
|
||||||
|
{
|
||||||
|
for (String string : entry.getValue())
|
||||||
|
{
|
||||||
|
group.addNode(string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
groups.add(group);
|
||||||
|
}
|
||||||
|
return groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Builds then loaded a new default group set into the terminal */
|
||||||
|
public static void loadNewGroupSet(ISpecialAccess terminal)
|
||||||
|
{
|
||||||
|
if (terminal != null)
|
||||||
|
{
|
||||||
|
List<AccessGroup> groups = getNewGroupSet();
|
||||||
|
for (AccessGroup group : groups)
|
||||||
|
{
|
||||||
|
terminal.addGroup(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(String node)
|
||||||
|
{
|
||||||
|
if (!nodes.contains(node))
|
||||||
|
{
|
||||||
|
nodes.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
src/dark/api/access/IProfileContainer.java
Normal file
15
src/dark/api/access/IProfileContainer.java
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
/** Applied to tileEntities that contain an access profile that describes how the tile interacts with
|
||||||
|
* users
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public interface IProfileContainer
|
||||||
|
{
|
||||||
|
/** Return the active profile of the machine. When calling this avoid editing the profile */
|
||||||
|
public AccessProfile getAccessProfile();
|
||||||
|
|
||||||
|
/** Strait up yes or no can this user access the tile. Any future checks should be done after the
|
||||||
|
* user has accessed the machine */
|
||||||
|
public boolean canAccess(String username);
|
||||||
|
}
|
39
src/dark/api/access/ISpecialAccess.java
Normal file
39
src/dark/api/access/ISpecialAccess.java
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/** Used by any object that needs to restrict access to it by a set of users or groups. Make sure to
|
||||||
|
* always use the default groups(user,admin,owner) so that things work smoothly.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public interface ISpecialAccess
|
||||||
|
{
|
||||||
|
/** Gets the user access instance */
|
||||||
|
public AccessUser getUserAccess(String username);
|
||||||
|
|
||||||
|
/** gets the user access list for the machine */
|
||||||
|
public List<AccessUser> getUsers();
|
||||||
|
|
||||||
|
/** sets the players access level in the access map. Make sure to remove the old user first. This
|
||||||
|
* can also be used to remove users if group is set to null. */
|
||||||
|
public boolean setUserAccess(String username, AccessGroup group, boolean save);
|
||||||
|
|
||||||
|
/** Sets the players access by using a completed AccessUser instance. Make sure to set its group
|
||||||
|
* if there is none. As well remove the old user first. */
|
||||||
|
public boolean setUserAccess(AccessUser user, AccessGroup group);
|
||||||
|
|
||||||
|
/** Get a group by name */
|
||||||
|
public AccessGroup getGroup(String name);
|
||||||
|
|
||||||
|
/** Get the master owner group */
|
||||||
|
public AccessGroup getOwnerGroup();
|
||||||
|
|
||||||
|
/** Get all groups linked this */
|
||||||
|
public List<AccessGroup> getGroups();
|
||||||
|
|
||||||
|
/** Add a group to the group list
|
||||||
|
*
|
||||||
|
* @return */
|
||||||
|
public boolean addGroup(AccessGroup group);
|
||||||
|
|
||||||
|
}
|
84
src/dark/api/access/Nodes.java
Normal file
84
src/dark/api/access/Nodes.java
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
package dark.api.access;
|
||||||
|
|
||||||
|
/** Constants that represent nodes by which machines and entities used in combination with
|
||||||
|
* ISpecialAccess to limit users on what they can do. These nodes should be used in the same way by
|
||||||
|
* all machines, entities, and other mods. Too change the meaning of the node will make it difficult
|
||||||
|
* to offer universal meaning for all machines. As well would create the need to add a per node per
|
||||||
|
* machine per group access list making it more complicated for users to use.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public class Nodes
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Rules for using nodes with groups and your machine:
|
||||||
|
*
|
||||||
|
* Keep everything the same.
|
||||||
|
* Eg: Open should be as simple as opening the gui and no more
|
||||||
|
*
|
||||||
|
* Enable is not the same as on
|
||||||
|
* Eg: you can disable a machine preventing users from using it
|
||||||
|
* Eg: When enabled the machine can still be turned off
|
||||||
|
*
|
||||||
|
* Lock node automatically includes unlock node but not the other way around
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Machine nodes override inv node as inv nodes are only designed for containers.
|
||||||
|
* Machines nodes are global for all guis inside the machine
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Groups do not need there own nodes. Group.user, Group.owner, Group.admin are designed to flag the default groups.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Your machine must always have a group that at least has a owner group. This group should be flagged with Group.owner but is not required.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Inventory only nodes, overrided by machine nodes
|
||||||
|
public static final String INV_OPEN_NODE = "inv.open";
|
||||||
|
public static final String INV_TAKE_NODE = "inv.take";
|
||||||
|
public static final String INV_GIVE_NODE = "inv.give";
|
||||||
|
public static final String INV_EDIT_NODE = "inv.edit";
|
||||||
|
public static final String INV_CHANGE_NODE = "inv.change";
|
||||||
|
public static final String INV_LOCK_NODE = "inv.lock";
|
||||||
|
public static final String INV_UNLOCK_NODE = "inv.unlock";
|
||||||
|
public static final String INV_DISABLE_NODE = "inv.disable";
|
||||||
|
public static final String INV_ENABLE_NODE = "inv.enable";
|
||||||
|
|
||||||
|
//Master machines nodes, overrides all lower nodes of the same type
|
||||||
|
public static final String MACHINE_OPEN_NODE = "machine.open";
|
||||||
|
public static final String MACHINE_LOCK_NODE = "machine.lock";
|
||||||
|
public static final String MACHINE_UNLOCK_NODE = "machine.unlock";
|
||||||
|
public static final String MACHINE_ENABLE_NODE = "machine.enable";
|
||||||
|
public static final String MACHINE_DISABLE_NODE = "machine.disable";
|
||||||
|
public static final String MACHINE_TURN_ON_NODE = "machine.on";
|
||||||
|
public static final String MACHINE_TURN_OFF_NODE = "machine.off";
|
||||||
|
public static final String MACHINE_CONFIG_NODE = "machine.config";
|
||||||
|
public static final String MACHINE_UPGRADE_NODE = "machine.upgrade";
|
||||||
|
public static final String MACHINE_DOWNGRADE_NODE = "machine.downgrade";
|
||||||
|
|
||||||
|
//Group nodes, these are almost always held by only admins and owners
|
||||||
|
public static final String GROUP_CREATE_NODE = "group.create";
|
||||||
|
public static final String GROUP_DEL_NODE = "group.del";
|
||||||
|
public static final String GROUP_EDIT_NODE = "group.edit";//Still bound by other nodes
|
||||||
|
public static final String GROUP_ADD_NODE = "group.add";
|
||||||
|
public static final String GROUP_ADD_USER_NODE = "group.add.user";
|
||||||
|
public static final String GROUP_ADD_ENTITY_NODE = "group.add.entity";
|
||||||
|
public static final String GROUP_ADD_NODE_NODE = "group.add.node";
|
||||||
|
public static final String GROUP_REMOVE_NODE = "group.remove";
|
||||||
|
public static final String GROUP_REMOVE_USER_NODE = "group.remove.user";
|
||||||
|
public static final String GROUP_REMOVE_ENTITY_NODE = "group.remove.entity";
|
||||||
|
public static final String GROUP_REMOVE_NODE_NODE = "group.remove.node";
|
||||||
|
|
||||||
|
//Nodes for editing users inside of a group
|
||||||
|
public static final String USER_EDIT_NODE = "user.edit";
|
||||||
|
public static final String USER_CHANGE_GROUP_NODE = "user.change.group";
|
||||||
|
public static final String USER_ADD_NODE = "user.add.node";
|
||||||
|
public static final String USER_REMOVE_NODE = "user.remove.node";
|
||||||
|
|
||||||
|
//Prefab group nodes, designed to be placed on the master group of the type
|
||||||
|
public static final String GROUP_OWNER_NODE = "group.owner";
|
||||||
|
public static final String GROUP_ADMIN_NODE = "group.admin";
|
||||||
|
public static final String GROUP_USER_NODE = "group.user";
|
||||||
|
}
|
12
src/dark/api/save/ISaveObj.java
Normal file
12
src/dark/api/save/ISaveObj.java
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package dark.api.save;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
|
||||||
|
public interface ISaveObj
|
||||||
|
{
|
||||||
|
/** Saves the object to NBT */
|
||||||
|
public void save(NBTTagCompound nbt);
|
||||||
|
|
||||||
|
/** Load the object from NBT */
|
||||||
|
public void load(NBTTagCompound nbt);
|
||||||
|
}
|
18
src/dark/api/save/IVirtualObject.java
Normal file
18
src/dark/api/save/IVirtualObject.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package dark.api.save;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
/** Used in combination with the save manager and other managers to say this object needs to be save
|
||||||
|
* since its not connected with the world
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public interface IVirtualObject extends ISaveObj
|
||||||
|
{
|
||||||
|
/** File this is saved as, don't create anything here as the manager will do that for you */
|
||||||
|
public File getSaveFile();
|
||||||
|
|
||||||
|
/** Will only be called after an object has been loaded. Allows the object to know were its been
|
||||||
|
* loaded from and decide if it wants to use the location as its getSaveFile return */
|
||||||
|
public void setSaveFile(File file);
|
||||||
|
|
||||||
|
}
|
338
src/dark/api/save/NBTFileHelper.java
Normal file
338
src/dark/api/save/NBTFileHelper.java
Normal file
|
@ -0,0 +1,338 @@
|
||||||
|
package dark.api.save;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.nbt.CompressedStreamTools;
|
||||||
|
import net.minecraft.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagByte;
|
||||||
|
import net.minecraft.nbt.NBTTagByteArray;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagDouble;
|
||||||
|
import net.minecraft.nbt.NBTTagFloat;
|
||||||
|
import net.minecraft.nbt.NBTTagInt;
|
||||||
|
import net.minecraft.nbt.NBTTagIntArray;
|
||||||
|
import net.minecraft.nbt.NBTTagLong;
|
||||||
|
import net.minecraft.nbt.NBTTagShort;
|
||||||
|
import net.minecraft.nbt.NBTTagString;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import universalelectricity.core.vector.Vector2;
|
||||||
|
import universalelectricity.core.vector.Vector3;
|
||||||
|
|
||||||
|
import com.builtbroken.common.science.units.UnitHelper;
|
||||||
|
|
||||||
|
import cpw.mods.fml.client.FMLClientHandler;
|
||||||
|
import cpw.mods.fml.common.FMLCommonHandler;
|
||||||
|
import cpw.mods.fml.common.FMLLog;
|
||||||
|
|
||||||
|
/** Helper class used to work with minecraft's NBT file system.
|
||||||
|
*
|
||||||
|
* @author DarkGuardsman */
|
||||||
|
public class NBTFileHelper
|
||||||
|
{
|
||||||
|
/** @param saveDirectory - file
|
||||||
|
* @param filename
|
||||||
|
* @param data
|
||||||
|
* @return */
|
||||||
|
public static boolean saveNBTFile(File saveDirectory, String filename, NBTTagCompound data)
|
||||||
|
{
|
||||||
|
return saveNBTFile(new File(saveDirectory, filename), data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Saves an NBT file
|
||||||
|
*
|
||||||
|
* @param file - exact File
|
||||||
|
* @param data - nbt data
|
||||||
|
* @return */
|
||||||
|
public static boolean saveNBTFile(File file, NBTTagCompound data)
|
||||||
|
{
|
||||||
|
if (file != null && data != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File tempFile = new File(file.getParent(), file.getName() + ".tmp");
|
||||||
|
|
||||||
|
CompressedStreamTools.writeCompressed(data, new FileOutputStream(tempFile));
|
||||||
|
|
||||||
|
if (file.exists())
|
||||||
|
{
|
||||||
|
file.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
tempFile.renameTo(file);
|
||||||
|
|
||||||
|
FMLLog.fine("Saved " + file.getName() + " NBT data file successfully.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Failed to save " + file.getName());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Uses the default world directory to save the data to file by the given name
|
||||||
|
*
|
||||||
|
* @param filename - file name
|
||||||
|
* @param data - nbt data
|
||||||
|
* @return true if everything goes well */
|
||||||
|
public static boolean saveNBTFile(String filename, NBTTagCompound data)
|
||||||
|
{
|
||||||
|
return saveNBTFile(getWorldSaveDirectory(MinecraftServer.getServer().getFolderName()), filename + ".dat", data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reads NBT data from the world folder.
|
||||||
|
*
|
||||||
|
* @return The NBT data */
|
||||||
|
public static NBTTagCompound loadNBTFile(File saveDirectory, String filename, boolean create)
|
||||||
|
{
|
||||||
|
if (saveDirectory != null && filename != null)
|
||||||
|
{
|
||||||
|
if (create && !saveDirectory.exists())
|
||||||
|
{
|
||||||
|
saveDirectory.mkdirs();
|
||||||
|
}
|
||||||
|
return loadNBTFile(new File(saveDirectory, filename + ".dat"), create);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NBTTagCompound loadNBTFile(File file, boolean create)
|
||||||
|
{
|
||||||
|
if (file != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
if (file.exists())
|
||||||
|
{
|
||||||
|
FMLLog.fine("Loaded " + file.getName() + " data.");
|
||||||
|
return CompressedStreamTools.readCompressed(new FileInputStream(file));
|
||||||
|
}
|
||||||
|
else if (create)
|
||||||
|
{
|
||||||
|
FMLLog.fine("Created new " + file.getName() + " data.");
|
||||||
|
return new NBTTagCompound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
System.out.println("Failed to load " + file.getName() + ".dat!");
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Loads an NBT file from the current world file
|
||||||
|
*
|
||||||
|
* @param filename - name of the file
|
||||||
|
* @return NBTTagCompound that was stored in the file */
|
||||||
|
public static NBTTagCompound loadNBTFile(String filename)
|
||||||
|
{
|
||||||
|
return loadNBTFile(getWorldSaveDirectory(MinecraftServer.getServer().getFolderName()), filename, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getWorldSaveDirectory(String worldName)
|
||||||
|
{
|
||||||
|
File parent = getBaseDirectory();
|
||||||
|
|
||||||
|
if (FMLCommonHandler.instance().getSide().isClient())
|
||||||
|
{
|
||||||
|
parent = new File(getBaseDirectory(), "saves" + File.separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new File(parent, worldName + File.separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getBaseDirectory()
|
||||||
|
{
|
||||||
|
if (FMLCommonHandler.instance().getSide().isClient())
|
||||||
|
{
|
||||||
|
FMLClientHandler.instance().getClient();
|
||||||
|
return Minecraft.getMinecraft().mcDataDir;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new File(".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Used to save an object without knowing what the object is exactly. Supports most
|
||||||
|
* NBTTagCompound save methods including some special cases. Which includes boolean being saves
|
||||||
|
* as a string so it can be loaded as a boolean from an object save.
|
||||||
|
*
|
||||||
|
* @param tag - NBTTagCompound to save the tag too
|
||||||
|
* @param key - name to save the object as
|
||||||
|
* @param value - the actual object
|
||||||
|
* @return the tag when done saving too i */
|
||||||
|
public static NBTTagCompound saveObject(NBTTagCompound tag, String key, Object value)
|
||||||
|
{
|
||||||
|
if (value instanceof Float)
|
||||||
|
{
|
||||||
|
tag.setFloat(key, (Float) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Double)
|
||||||
|
{
|
||||||
|
tag.setDouble(key, (Double) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Integer)
|
||||||
|
{
|
||||||
|
tag.setInteger(key, (Integer) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof String)
|
||||||
|
{
|
||||||
|
tag.setString(key, (String) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Short)
|
||||||
|
{
|
||||||
|
tag.setShort(key, (Short) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Byte)
|
||||||
|
{
|
||||||
|
tag.setByte(key, (Byte) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Long)
|
||||||
|
{
|
||||||
|
tag.setLong(key, (Long) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Boolean)
|
||||||
|
{
|
||||||
|
tag.setString(key, "NBT:SAVE:BOOLEAN:" + value);
|
||||||
|
}
|
||||||
|
else if (value instanceof NBTBase)
|
||||||
|
{
|
||||||
|
tag.setTag(key, (NBTBase) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof String)
|
||||||
|
{
|
||||||
|
tag.setString(key, (String) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof byte[])
|
||||||
|
{
|
||||||
|
tag.setByteArray(key, (byte[]) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof int[])
|
||||||
|
{
|
||||||
|
tag.setIntArray(key, (int[]) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof NBTTagCompound)
|
||||||
|
{
|
||||||
|
tag.setCompoundTag(key, (NBTTagCompound) value);
|
||||||
|
}
|
||||||
|
else if (value instanceof Vector2)
|
||||||
|
{
|
||||||
|
tag.setString(key, "NBT:SAVE:VECTOR:2:" + ((Vector2) value).x + ":" + ((Vector2) value).y);
|
||||||
|
}
|
||||||
|
else if (value instanceof Vector3)
|
||||||
|
{
|
||||||
|
tag.setString(key, "NBT:SAVE:VECTOR:3:" + ((Vector3) value).x + ":" + ((Vector3) value).y + ":" + ((Vector3) value).z);
|
||||||
|
}
|
||||||
|
return tag;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @param key
|
||||||
|
* @param value
|
||||||
|
* @return NBTTagCompound that then can be added to save file */
|
||||||
|
public static NBTTagCompound saveObject(String key, Object value)
|
||||||
|
{
|
||||||
|
return NBTFileHelper.saveObject(new NBTTagCompound(), key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Reads an unknown object with a known name from NBT
|
||||||
|
*
|
||||||
|
* @param tag - tag to read the value from
|
||||||
|
* @param key - name of the value
|
||||||
|
* @param suggestionValue - value to return in case nothing is found
|
||||||
|
* @return object or suggestionValue if nothing is found */
|
||||||
|
public static Object loadObject(NBTTagCompound tag, String key)
|
||||||
|
{
|
||||||
|
if (tag != null && key != null)
|
||||||
|
{
|
||||||
|
NBTBase saveTag = tag.getTag(key);
|
||||||
|
if (saveTag instanceof NBTTagFloat)
|
||||||
|
{
|
||||||
|
return tag.getFloat(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagDouble)
|
||||||
|
{
|
||||||
|
return tag.getDouble(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagInt)
|
||||||
|
{
|
||||||
|
return tag.getInteger(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagString)
|
||||||
|
{
|
||||||
|
String str = tag.getString(key);
|
||||||
|
if (str.startsWith("NBT:SAVE:"))
|
||||||
|
{
|
||||||
|
str.replaceAll("NBT:SAVE:", "");
|
||||||
|
if (str.startsWith("BOOLEAN:"))
|
||||||
|
{
|
||||||
|
str.replaceAll("BOOLEAN:", "");
|
||||||
|
if (str.equalsIgnoreCase("true"))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (str.equalsIgnoreCase("false"))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (str.startsWith("VECTOR:"))
|
||||||
|
{
|
||||||
|
str.replaceAll("VECTOR:", "");
|
||||||
|
String[] nums = str.split(":");
|
||||||
|
if (UnitHelper.tryToParseDouble(nums[0]) == 2)
|
||||||
|
{
|
||||||
|
return new Vector2(UnitHelper.tryToParseDouble(nums[1]), UnitHelper.tryToParseDouble(nums[2]));
|
||||||
|
}
|
||||||
|
if (UnitHelper.tryToParseDouble(nums[0]) == 3)
|
||||||
|
{
|
||||||
|
return new Vector3(UnitHelper.tryToParseDouble(nums[1]), UnitHelper.tryToParseDouble(nums[2]), UnitHelper.tryToParseDouble(nums[3]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagShort)
|
||||||
|
{
|
||||||
|
return tag.getShort(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagByte)
|
||||||
|
{
|
||||||
|
return tag.getByte(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagLong)
|
||||||
|
{
|
||||||
|
return tag.getLong(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTBase)
|
||||||
|
{
|
||||||
|
return tag.getTag(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagByteArray)
|
||||||
|
{
|
||||||
|
return tag.getByteArray(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagIntArray)
|
||||||
|
{
|
||||||
|
return tag.getIntArray(key);
|
||||||
|
}
|
||||||
|
else if (saveTag instanceof NBTTagCompound)
|
||||||
|
{
|
||||||
|
return tag.getCompoundTag(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
164
src/dark/api/save/SaveManager.java
Normal file
164
src/dark/api/save/SaveManager.java
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
package dark.api.save;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraftforge.event.ForgeSubscribe;
|
||||||
|
import net.minecraftforge.event.world.WorldEvent;
|
||||||
|
import cpw.mods.fml.common.FMLLog;
|
||||||
|
|
||||||
|
public class SaveManager
|
||||||
|
{
|
||||||
|
private static HashMap<String, Class<?>> idToClassMap = new HashMap<String, Class<?>>();
|
||||||
|
private static HashMap<Class<?>, String> classToIDMap = new HashMap<Class<?>, String>();
|
||||||
|
private static List<Object> saveList = new ArrayList<Object>();
|
||||||
|
private static List<Object> objects = new ArrayList<Object>();
|
||||||
|
private static SaveManager instance;
|
||||||
|
|
||||||
|
public static SaveManager instance()
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
instance = new SaveManager();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Called when the object wants to be save only on the next save call. Will be removed from the
|
||||||
|
* save manager after */
|
||||||
|
public static void markNeedsSaved(Object object)
|
||||||
|
{
|
||||||
|
if (object instanceof IVirtualObject && !saveList.contains(object))
|
||||||
|
{
|
||||||
|
saveList.add(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Registers the object to be saved on each world save event */
|
||||||
|
public static void register(Object object)
|
||||||
|
{
|
||||||
|
if (object instanceof IVirtualObject && !objects.contains(object))
|
||||||
|
{
|
||||||
|
objects.add(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void registerClass(String id, Class clazz)
|
||||||
|
{
|
||||||
|
if (id != null && clazz != null)
|
||||||
|
{
|
||||||
|
if (idToClassMap.containsKey(id) && idToClassMap.get(id) != null)
|
||||||
|
{
|
||||||
|
System.out.println("[CoreMachine]SaveManager: Something attempted to register a class with the id of another class");
|
||||||
|
System.out.println("[CoreMachine]SaveManager: Id:" + id + " Class:" + clazz.getName());
|
||||||
|
System.out.println("[CoreMachine]SaveManager: OtherClass:" + idToClassMap.get(id).getName());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idToClassMap.put(id, clazz);
|
||||||
|
classToIDMap.put(clazz, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object createAndLoad(File file)
|
||||||
|
{
|
||||||
|
if (file.exists())
|
||||||
|
{
|
||||||
|
Object obj = createAndLoad(NBTFileHelper.loadNBTFile(file, false));
|
||||||
|
if (obj instanceof IVirtualObject)
|
||||||
|
{
|
||||||
|
((IVirtualObject) obj).setSaveFile(file);
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Creates an object from the save using its id */
|
||||||
|
public static Object createAndLoad(NBTTagCompound par0NBTTagCompound)
|
||||||
|
{
|
||||||
|
Object obj = null;
|
||||||
|
if (par0NBTTagCompound != null && par0NBTTagCompound.hasKey("id"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class clazz = getClass(par0NBTTagCompound.getString("id"));
|
||||||
|
|
||||||
|
if (clazz != null)
|
||||||
|
{
|
||||||
|
obj = clazz.newInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof IVirtualObject)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
((IVirtualObject) obj).load(par0NBTTagCompound);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
FMLLog.log(Level.SEVERE, e, "An object %s(%s) has thrown an exception during loading, its state cannot be restored. Report this to the mod author", par0NBTTagCompound.getString("id"), obj.getClass().getName());
|
||||||
|
obj = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MinecraftServer.getServer().getLogAgent().logWarning("Skipping object with id " + par0NBTTagCompound.getString("id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ForgeSubscribe
|
||||||
|
public void worldSave(WorldEvent evt)
|
||||||
|
{
|
||||||
|
SaveManager.saveList.addAll(SaveManager.objects);
|
||||||
|
for (Object object : SaveManager.saveList)
|
||||||
|
{
|
||||||
|
if (object instanceof IVirtualObject)
|
||||||
|
{
|
||||||
|
saveObject(object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Saves an object along with its ID */
|
||||||
|
public static void saveObject(Object object)
|
||||||
|
{
|
||||||
|
if (object instanceof IVirtualObject && getID(object.getClass()) != null && ((IVirtualObject) object).getSaveFile() != null)
|
||||||
|
{
|
||||||
|
File file = ((IVirtualObject) object).getSaveFile();
|
||||||
|
file.mkdirs();
|
||||||
|
NBTTagCompound tag = new NBTTagCompound();
|
||||||
|
((IVirtualObject) object).save(tag);
|
||||||
|
tag.setString("id", getID(object.getClass()));
|
||||||
|
NBTFileHelper.saveNBTFile(file, tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets the ID that the class will be saved using */
|
||||||
|
public static String getID(Class clazz)
|
||||||
|
{
|
||||||
|
return classToIDMap.get(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets the class that was registered with the ID */
|
||||||
|
public static Class getClass(String id)
|
||||||
|
{
|
||||||
|
return idToClassMap.get(id);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue