/** * Returns a CArray given an MCColor. It will be in the format array(r: 0, g: 0, b: 0) * * @param color * @param t * @return */ public CArray color(MCColor color, Target t) { CArray ca = new CArray(t); ca.set("r", new CInt(color.getRed(), t), t); ca.set("g", new CInt(color.getGreen(), t), t); ca.set("b", new CInt(color.getBlue(), t), t); return ca; }
private static CArray deepClone(CArray array, Target t, ArrayList<CArray[]> cloneRefs) { // Return the clone reference if this array has been cloned before (both clones will have the // same reference). for (CArray[] refCouple : cloneRefs) { if (refCouple[0] == array) { return refCouple[1]; } } // Create the clone to put array in and add it to the cloneRefs list. CArray clone = new CArray(t, (int) array.size()); clone.associative_mode = array.associative_mode; cloneRefs.add(new CArray[] {array, clone}); // Iterate over the array, recursively calling this method to perform a deep clone. for (Construct key : array.keySet()) { Construct value = array.get(key, t); if (value instanceof CArray) { value = deepClone((CArray) value, t, cloneRefs); } clone.set(key, value, t); } return clone; }
public CArray velocity(MCEntity.Velocity v, Target t) { double x, y, z, mag; x = y = z = mag = 0; if (v != null) { x = v.x; y = v.y; z = v.z; mag = v.magnitude; } CArray ret = CArray.GetAssociativeArray(t); ret.set("magnitude", new CDouble(mag, t), t); ret.set("x", new CDouble(x, t), t); ret.set("y", new CDouble(y, t), t); ret.set("z", new CDouble(z, t), t); return ret; }
/** * An Item Object consists of data about a particular item stack. Information included is: type, * data, qty, and an array of enchantment objects (labeled enchants): etype (enchantment type) and * elevel (enchantment level). For backwards compatibility, this information is also listed in * numerical slots as well as associative slots. If the MCItemStack is null, or the underlying * item is nonexistant (or air) CNull is returned. * * @param is * @return */ public Construct item(MCItemStack is, Target t) { if (is == null || is.getAmount() == 0) { return new CNull(t); } int type = is.getTypeId(); int data; if (type < 256) { // Use the data data = (is.getData() != null ? is.getData().getData() : 0); } else { // Use the durability data = is.getDurability(); } int qty = is.getAmount(); CArray enchants = new CArray(t); for (Map.Entry<MCEnchantment, Integer> entry : is.getEnchantments().entrySet()) { CArray enchObj = CArray.GetAssociativeArray(t); enchObj.set("etype", new CString(entry.getKey().getName(), t), t); enchObj.set("elevel", new CInt(entry.getValue(), t), t); enchants.push(enchObj); } Construct meta = itemMeta(is, t); CArray ret = CArray.GetAssociativeArray(t); ret.set("type", Integer.toString(type)); ret.set("data", Integer.toString(data)); ret.set("qty", Integer.toString(qty)); ret.set("enchants", enchants, t); ret.set("meta", meta, t); return ret; }
/** * Gets a Location Object, given a MCLocation * * @param l * @return */ public CArray location(MCLocation l) { CArray ca = CArray.GetAssociativeArray(Target.UNKNOWN); Construct x = new CDouble(l.getX(), Target.UNKNOWN); Construct y = new CDouble(l.getY(), Target.UNKNOWN); Construct z = new CDouble(l.getZ(), Target.UNKNOWN); Construct world = new CString(l.getWorld().getName(), Target.UNKNOWN); Construct yaw = new CDouble(l.getYaw(), Target.UNKNOWN); Construct pitch = new CDouble(l.getPitch(), Target.UNKNOWN); ca.set("0", x, Target.UNKNOWN); ca.set("1", y, Target.UNKNOWN); ca.set("2", z, Target.UNKNOWN); ca.set("3", world, Target.UNKNOWN); ca.set("4", yaw, Target.UNKNOWN); ca.set("5", pitch, Target.UNKNOWN); ca.set("x", x, Target.UNKNOWN); ca.set("y", y, Target.UNKNOWN); ca.set("z", z, Target.UNKNOWN); ca.set("world", world, Target.UNKNOWN); ca.set("yaw", yaw, Target.UNKNOWN); ca.set("pitch", pitch, Target.UNKNOWN); return ca; }
public final void set(String index, String value) { set(index, value, Target.UNKNOWN); }
public final void set(String index, String value, Target t) { set(index, new CString(value, t), t); }
public final void set(String index, Construct c, Target t) { set(new CString(index, c.getTarget()), c, t); }
@Override public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException { try { Profiles.Profile profile; if (args[0] instanceof CArray) { Map<String, String> data = new HashMap<String, String>(); for (String key : ((CArray) args[0]).keySet()) { data.put(key, ((CArray) args[0]).get(key).val()); } profile = Profiles.getProfile(data); } else { Profiles profiles = environment.getEnv(GlobalEnv.class).getSQLProfiles(); profile = profiles.getProfileById(args[0].val()); } String query = args[1].val(); Construct[] params = new Construct[args.length - 2]; for (int i = 2; i < args.length; i++) { int index = i - 2; params[index] = args[i]; } // Parameters are now all parsed into java objects. Connection conn = DriverManager.getConnection(profile.getConnectionString()); PreparedStatement ps = null; try { ps = conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); for (int i = 0; i < params.length; i++) { int type = ps.getParameterMetaData().getParameterType(i + 1); if (params[i] == null) { if (ps.getParameterMetaData().isNullable(i + 1) == ParameterMetaData.parameterNoNulls) { throw new ConfigRuntimeException( "Parameter " + (i + 1) + " cannot be set to null. Check your parameters and try again.", ExceptionType.SQLException, t); } else { ps.setNull(i + 1, type); continue; } } try { if (params[i] instanceof CInt) { ps.setLong(i + 1, Static.getInt(params[i], t)); } else if (params[i] instanceof CDouble) { ps.setDouble(i + 1, (Double) Static.getDouble(params[i], t)); } else if (params[i] instanceof CString) { ps.setString(i + 1, (String) params[i].val()); } else if (params[i] instanceof CByteArray) { ps.setBytes(i + 1, ((CByteArray) params[i]).asByteArrayCopy()); } else if (params[i] instanceof CBoolean) { ps.setBoolean(i + 1, Static.getBoolean(params[i])); } else { throw new ConfigRuntimeException( "The type " + params[i].getClass().getSimpleName() + " of parameter " + (i + 1) + " is not supported.", ExceptionType.CastException, t); } } catch (ClassCastException ex) { throw new ConfigRuntimeException( "Could not cast parameter " + (i + 1) + " to " + ps.getParameterMetaData().getParameterTypeName(i + 1) + " from " + params[i].getClass().getSimpleName() + ".", ExceptionType.CastException, t, ex); } } boolean isResultSet = ps.execute(); if (isResultSet) { // Result set CArray ret = new CArray(t); ResultSetMetaData md = ps.getMetaData(); ResultSet rs = ps.getResultSet(); while (rs.next()) { CArray row = new CArray(t); for (int i = 1; i <= md.getColumnCount(); i++) { Construct value; int columnType = md.getColumnType(i); if (columnType == Types.INTEGER || columnType == Types.TINYINT || columnType == Types.SMALLINT || columnType == Types.BIGINT) { value = new CInt(rs.getLong(i), t); } else if (columnType == Types.FLOAT || columnType == Types.DOUBLE || columnType == Types.REAL || columnType == Types.DECIMAL || columnType == Types.NUMERIC) { value = new CDouble(rs.getDouble(i), t); } else if (columnType == Types.VARCHAR || columnType == Types.CHAR || columnType == Types.LONGVARCHAR) { value = new CString(rs.getString(i), t); } else if (columnType == Types.BLOB || columnType == Types.BINARY || columnType == Types.VARBINARY || columnType == Types.LONGVARBINARY) { value = CByteArray.wrap(rs.getBytes(i), t); } else if (columnType == Types.DATE || columnType == Types.TIME || columnType == Types.TIMESTAMP) { if (md.getColumnTypeName(i).equals("YEAR")) { value = new CInt(rs.getLong(i), t); } else { value = new CInt(rs.getTimestamp(i).getTime(), t); } } else if (columnType == Types.BOOLEAN || columnType == Types.BIT) { value = new CBoolean(rs.getBoolean(i), t); } else { throw new ConfigRuntimeException( "SQL returned a unhandled column type " + md.getColumnTypeName(i) + " for column " + md.getColumnName(i) + ".", ExceptionType.CastException, t); } row.set(md.getColumnName(i), value, t); } ret.push(row); } return ret; } else { ResultSet rs = ps.getGeneratedKeys(); if (rs.next()) { // This was an insert or something that returned generated keys. So we return // that here. return new CInt(rs.getInt(1), t); } // Update count. Just return null. return new CNull(t); } } finally { if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } } catch (Profiles.InvalidProfileException ex) { throw new ConfigRuntimeException(ex.getMessage(), ExceptionType.SQLException, t, ex); } catch (SQLException ex) { throw new ConfigRuntimeException(ex.getMessage(), ExceptionType.SQLException, t, ex); } }
public Construct itemMeta(MCItemStack is, Target t) { Construct ret, display, lore, color, title, author, pages, owner, stored; if (!is.hasItemMeta()) { ret = new CNull(t); } else { ret = CArray.GetAssociativeArray(t); MCItemMeta meta = is.getItemMeta(); if (meta.hasDisplayName()) { display = new CString(meta.getDisplayName(), t); } else { display = new CNull(t); } if (meta.hasLore()) { lore = new CArray(t); for (String l : meta.getLore()) { ((CArray) lore).push(new CString(l, t)); } } else { lore = new CNull(t); } ((CArray) ret).set("display", display, t); ((CArray) ret).set("lore", lore, t); if (meta instanceof MCLeatherArmorMeta) { color = color(((MCLeatherArmorMeta) meta).getColor(), t); ((CArray) ret).set("color", color, t); } if (meta instanceof MCBookMeta) { if (((MCBookMeta) meta).hasTitle()) { title = new CString(((MCBookMeta) meta).getTitle(), t); } else { title = new CNull(t); } if (((MCBookMeta) meta).hasAuthor()) { author = new CString(((MCBookMeta) meta).getAuthor(), t); } else { author = new CNull(t); } if (((MCBookMeta) meta).hasPages()) { pages = new CArray(t); for (String p : ((MCBookMeta) meta).getPages()) { ((CArray) pages).push(new CString(p, t)); } } else { pages = new CNull(t); } ((CArray) ret).set("title", title, t); ((CArray) ret).set("author", author, t); ((CArray) ret).set("pages", pages, t); } if (meta instanceof MCSkullMeta) { if (((MCSkullMeta) meta).hasOwner()) { owner = new CString(((MCSkullMeta) meta).getOwner(), t); } else { owner = new CNull(t); } ((CArray) ret).set("owner", owner, t); } if (meta instanceof MCEnchantmentStorageMeta) { if (((MCEnchantmentStorageMeta) meta).hasStoredEnchants()) { stored = new CArray(t); for (Map.Entry<MCEnchantment, Integer> entry : ((MCEnchantmentStorageMeta) meta).getStoredEnchants().entrySet()) { CArray eObj = CArray.GetAssociativeArray(t); eObj.set("etype", new CString(entry.getKey().getName(), t), t); eObj.set("elevel", new CInt(entry.getValue(), t), t); ((CArray) stored).push(eObj); } } else { stored = new CNull(t); } ((CArray) ret).set("stored", stored, t); } } return ret; }
/** * Gets an MCItemStack from a given item "object". Supports both the old and new formats currently * * @param i * @param line_num * @param f * @return */ public MCItemStack item(Construct i, Target t) { if (i instanceof CNull) { return EmptyItem(); } if (!(i instanceof CArray)) { throw new ConfigRuntimeException("Expected an array!", ExceptionType.FormatException, t); } CArray item = (CArray) i; int type = 0; int data = 0; int qty = 1; Map<MCEnchantment, Integer> enchants = new HashMap<MCEnchantment, Integer>(); MCItemMeta meta = null; if (item.containsKey("type")) { try { if (item.get("type").val().contains(":")) { // We're using the combo addressing method String[] split = item.get("type").val().split(":"); item.set("type", split[0]); item.set("data", split[1]); } type = Integer.parseInt(item.get("type").val()); } catch (NumberFormatException e) { throw new ConfigRuntimeException( "Could not get item information from given information (" + item.get("type").val() + ")", ExceptionType.FormatException, t, e); } } else { throw new ConfigRuntimeException( "Could not find item type!", ExceptionType.FormatException, t); } if (item.containsKey("data")) { try { data = Integer.parseInt(item.get("data").val()); } catch (NumberFormatException e) { throw new ConfigRuntimeException( "Could not get item data from given information (" + item.get("data").val() + ")", ExceptionType.FormatException, t, e); } } if (item.containsKey("qty")) { // This is the qty String sqty = "notanumber"; if (item.containsKey("qty")) { sqty = item.get("qty").val(); } try { qty = Integer.parseInt(sqty); } catch (NumberFormatException e) { throw new ConfigRuntimeException( "Could not get qty from given information (" + sqty + ")", ExceptionType.FormatException, t, e); } } if (item.containsKey("enchants")) { CArray enchantArray = null; try { if (item.containsKey("enchants")) { enchantArray = (CArray) item.get("enchants"); } if (enchantArray == null) { throw new NullPointerException(); } } catch (Exception e) { throw new ConfigRuntimeException( "Could not get enchantment data from given information.", ExceptionType.FormatException, t, e); } for (String index : enchantArray.keySet()) { try { CArray enchantment = (CArray) enchantArray.get(index); String setype = null; String selevel = null; if (enchantment.containsKey("etype")) { setype = enchantment.get("etype").val(); } if (enchantment.containsKey("elevel")) { selevel = enchantment.get("elevel").val(); } if (setype == null || selevel == null) { throw new ConfigRuntimeException( "Could not get enchantment data from given information.", ExceptionType.FormatException, t); } int elevel = 0; try { elevel = Integer.parseInt(selevel); } catch (NumberFormatException e) { throw new ConfigRuntimeException( "Could not get enchantment data from given information.", ExceptionType.FormatException, t); } MCEnchantment etype = StaticLayer.GetEnchantmentByName(setype); enchants.put(etype, elevel); } catch (ClassCastException e) { throw new ConfigRuntimeException( "Could not get enchantment data from given information.", ExceptionType.FormatException, t, e); } } } if (item.containsKey("meta")) { meta = itemMeta(item.get("meta"), type, t); } MCItemStack ret = StaticLayer.GetItemStack(type, qty); ret.setData(data); ret.setDurability((short) data); if (meta != null) { ret.setItemMeta(meta); } for (Map.Entry<MCEnchantment, Integer> entry : enchants.entrySet()) { ret.addUnsafeEnchantment(entry.getKey(), entry.getValue()); } // Giving them air crashes the client, so just clear the inventory slot if (ret.getTypeId() == 0) { ret = EmptyItem(); } return ret; }