Space Engineers

Space Engineers

Not enough ratings
Prevenir la sobreescritura de las customData
By f2nt4sm6
¿Como evitar que otro script borre los datos que dejo dentro de los bloques?
   
Award
Favorite
Favorited
Unfavorite
Código de prevención.(copiar y pegar)
Si tenemos varios script escribiendo en los CustomData, tendremos el problema de la sobreescritura. Para evitarlo he creado este código. Permito copiar y pegar. Mas abajo hay instrucciones de como usarlo.

const char _dataSeparator = ','; const char _startGroupSeparator = '{'; const char _endGroupSeparator = '}'; const char _valueSeparator = ':'; const char _arrayValuesSeparator = _valueSeparator; class CustomDataEditor{ private static string getDataGroup(IMyTerminalBlock block, string dataGroup){ if(dataGroup == String.Empty) throw new System.Exception("Missed: Name of the Group"); int groupIndex = block.CustomData.IndexOf(dataGroup); if(groupIndex != -1){ int endGroupIndex = block.CustomData.IndexOf(_endGroupSeparator,groupIndex); return block.CustomData.Substring(groupIndex, endGroupIndex - groupIndex+1); } return String.Empty; } private static string getDataVar(string dataGroup, string varName){ if(varName == String.Empty) throw new System.Exception("Missed: Name of the variable"); int dataIndex = dataGroup.IndexOf(varName); if(dataIndex != -1){ int endDataIndex = dataGroup.IndexOf(_dataSeparator,dataIndex); return dataGroup.Substring(dataIndex, endDataIndex - dataIndex+1); } return String.Empty; } public static void setData(IMyTerminalBlock block, string dataGroup, string varName, string value){ if(value == String.Empty) throw new System.Exception("Missed: value"); string storedDG = CustomDataEditor.getDataGroup(block, dataGroup); if(storedDG == String.Empty){ block.CustomData += dataGroup+_startGroupSeparator+"\n"+varName+_valueSeparator+value+_dataSeparator+"\n"+_endGroupSeparator+"\n"; }else{ string storedDV = CustomDataEditor.getDataVar(storedDG, varName); if(storedDV == String.Empty){ string newDG = storedDG.Substring(0,storedDG.Length-1)+varName+_valueSeparator+value+_dataSeparator+"\n"+_endGroupSeparator; block.CustomData = block.CustomData.Replace(storedDG,newDG); }else{ string newValue = varName+':'+value+_dataSeparator; string newDG = storedDG.Replace(storedDV,newValue); block.CustomData = block.CustomData.Replace(storedDG,newDG); } } } public static void setArrayData(IMyTerminalBlock block, string dataGroup, string varName, string[] values){ if(values.Length == 0) throw new System.Exception("Missed: values"); string newdata =""; foreach(string value in values){ if(newdata != ""){ newdata += _arrayValuesSeparator; } newdata += value; } CustomDataEditor.setData(block,dataGroup,varName,newdata); } public static void setArrayData(IMyTerminalBlock block, string dataGroup, string varName, List<string> values){ CustomDataEditor.setArrayData(block,dataGroup,varName,values.ToArray()); } public static string getData(IMyTerminalBlock block, string dataGroup, string varName){ if(dataGroup == String.Empty) throw new System.Exception("Missed: Name of the Group"); if(varName == String.Empty) throw new System.Exception("Missed: Name of the variable"); string storedDG = CustomDataEditor.getDataGroup(block, dataGroup); if(storedDG == String.Empty){ return String.Empty; } string storedDV = CustomDataEditor.getDataVar(storedDG, varName); if(storedDV == String.Empty){ return String.Empty; } int start= varName.Length+1; int length = storedDV.Length - start-1; return storedDV.Substring(start, length); } public static string[] getArrayData(IMyTerminalBlock block, string dataGroup, string varName){ string data = CustomDataEditor.getData(block, dataGroup, varName); return data.Split(_arrayValuesSeparator); } public static void removeVar(IMyTerminalBlock block, string dataGroup, string varName){ if(dataGroup == String.Empty) throw new System.Exception("Missed: Name of the Group"); if(varName == String.Empty) throw new System.Exception("Missed: Name of the variable"); string storedDG = CustomDataEditor.getDataGroup(block, dataGroup); if(storedDG != String.Empty){ int start = storedDG.IndexOf(varName); if(start > -1){ int end = storedDG.IndexOf(_dataSeparator, start)+2; string newDG = storedDG.Substring(0,start) + storedDG.Substring(end); block.CustomData = block.CustomData.Replace(storedDG, newDG); } } } public static void removeGroup(IMyTerminalBlock block, string dataGroup){ if(dataGroup == String.Empty) throw new System.Exception("Missed: Name of the Group"); int start = block.CustomData.IndexOf(dataGroup); if(start > -1){ int end = block.CustomData.IndexOf(_endGroupSeparator, start)+2; block.CustomData = block.CustomData.Substring(0,start) + block.CustomData.Substring(end); } } }
Uso de las funciones.
Parametros de todas las funciones:
block -> Bloque del cual se desea editar algún dato.
dataGroup -> Nombre del grupo de datos. Evita que los scripts sobreescriban los datos entre ellos.
varName -> Nombre de la variable.
value -> Vallor de la variable.

void CustomDataEditor.setData(IMyTerminalBlock block, string dataGroup, string varName, string value)
void CustomDataEditor.setArrayData(IMyTerminalBlock block, string dataGroup, string varName, string[] values)
void CustomDataEditor.setArrayData(IMyTerminalBlock block, string dataGroup, string varName, List<string> values)
Cambian o crean una variable. También crean el grupo de datos si es necesario.

string CustomDataEditor.getData(IMyTerminalBlock block, string dataGroup, string varName)
string[] CustomDataEditor.getArrayData(IMyTerminalBlock block, string dataGroup, string varName)
Retornan el valor de la variable.

voidCustomDataEditor. CustomDataEditor.removeVar(IMyTerminalBlock block, string dataGroup, string varName)
Borra la variable.

void CustomDataEditor.removeGroup(IMyTerminalBlock block, string dataGroup)
Borra un grupo incluyendo sus variables.
Edición durante el juego
Para introducir datos durante el juego hice este script.
http://steamcommunity.com/sharedfiles/filedetails/?id=822223862
El script funciona con los siguientes comandos.

set,NombreBloque,dataGroup, varName,value1,value2,..,valueN
Añade los datos

removeVar,NombreBloque,dataGroup, varName
Borra una variable

removeGroup,NombreBloque,dataGroup
Borra un grupo.