network = {} -- Shared Side Start -- local function ConvertStringToRequiredItems(value) local relatedItemClass = LuaUserData.CreateStatic("Barotrauma.RelatedItem") local requiredItems = {} for requiredItemXml in value:gmatch("<[^>]+/>") do local xml = XDocument.Parse(requiredItemXml).Root local contentXml = ContentXElement(nil, xml) local relatedItem = relatedItemClass.__new(contentXml, "LuaEditorRequiredItem") local requiredType = relatedItem.Type if requiredItems[requiredType] == nil then requiredItems[requiredType] = {relatedItem} else table.insert(requiredItems[requiredType], relatedItem) end end return requiredItems end -- Shared Side End -- -- Client Side Start -- if CLIENT then local function ConvertToString(value) return tostring(value) end local function ConvertColorToString(value) if type(value) == "userdata" then return string.format("%f,%f,%f,%f", value.r, value.g, value.b, value.a) else print("failed to convert color") end end local function ConvertRequiredItemsToString(value) if type(value) == "table" then local requiredItemsXMLs = " " for requiredType, requiredTypeItems in pairs(value) do for i, requiredItem in ipairs(requiredTypeItems) do local requiredItemsXML = XElement("requireditem") requiredItem.Save(requiredItemsXML) requiredItemsXMLs = requiredItemsXMLs .. tostring(requiredItemsXML) end end return requiredItemsXMLs else print("failed to convert RequiredItems to string") end end Update = { itemupdatevalue = { {"String", "String", "Number", "Number2"}, -- Three parameters: ItemString, ActionString, Value fn = function(ItemString, ActionString, Value, Value2) if Value2 == "Color" then itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertColorToString(Value) .. "|" .. Value2 elseif Value2 == "RequiredItems" then itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertRequiredItemsToString(Value) .. "|" .. Value2 else if Value2 then itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertToString(Value) .. "|" .. ConvertToString(Value2) else itemupdatestring = ItemString .. "|" .. ActionString .. "|" .. ConvertToString(Value) end end local itemupdatenetwork = Networking.Start("itemupdatenetworking") itemupdatenetwork.WriteString(itemupdatestring) Networking.Send(itemupdatenetwork) end } } Networking.Receive("settingsnetworking", function (settingsnetwork) local receivedData = settingsnetwork.ReadString() -- Get the received string -- Deserialize the received string into a Lua table local Settings = {} for key, value in string.gmatch(receivedData, '([^;]+)=([^;]+)') do if value == "true" then Settings[key] = true elseif value == "false" then Settings[key] = false else Settings[key] = tonumber(value) or value end end -- Update your local settings with the received data EditGUI.Settings = Settings end) EditGUI.networkstart = function() if Game.IsMultiplayer and settings == false or settings == nil then EditGUI.AddMessage("Applied settings to " .. itemedit.Name, owner) else if settings == true then File.Write(EditGUI.Path .. "/clientsidesettings.json", json.serialize(EditGUI.ClientsideSettings)) if Game.IsMultiplayer then local serializedData = "" for key, value in pairs(EditGUI.Settings) do if type(value) == "boolean" then value = tostring(value) end serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" end local settingsnetwork = Networking.Start("settingsnetworkupdate") settingsnetwork.WriteString(serializedData) Networking.Send(settingsnetwork) else File.Write(EditGUI.Path .. "/settings.json", json.serialize(EditGUI.Settings)) end EditGUI.AddMessage("Saved Changes", owner) else if itemedit == nil then return end EditGUI.AddMessage("Apply unnecessary in singleplayer", owner) end end end end -- Client Side End -- -- Server Side Start if SERVER then EditGUI.Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) local function split(str, separator) if str == nil then return {} -- Return an empty table for an empty string end local result = {} local pattern = string.format("([^%s]+)", separator) str:gsub(pattern, function(c) result[#result + 1] = c end) return result end function removePeriodsAndNumbers(inputString) local stringWithoutPeriodsAndNumbers = string.gsub(inputString, "[%.%d]", "") return stringWithoutPeriodsAndNumbers end Networking.Receive("itemupdatenetworking", function (itemupdatenetwork,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end itemupdatestring = itemupdatenetwork.ReadString() local values = split(itemupdatestring, "|") local ItemString = values[1] local ActionString = values[2] local ValueString = values[3] if values[4] then ValueString2 = values[4] else ValueString2 = nil end -- Perform the logic on the server local itemedit = Entity.FindEntityByID(tonumber(ItemString)) local Value = nil if ValueString == "true" then Value = true elseif ValueString == "false" then Value = false elseif ValueString2 == "Color" then local colorValues = split(ValueString , ",") if #colorValues == 4 then Value = Color(tonumber(colorValues[1]), tonumber(colorValues[2]), tonumber(colorValues[3]), tonumber(colorValues[4])) end elseif ValueString2 == "RequiredItems" then Value = ConvertStringToRequiredItems(ValueString) else Value = tonumber(ValueString) or ValueString end local mainAction, subAction = ActionString:match("(.-)%.([^%.]+)$") local valueStringOutput = ValueString or "nil" if mainAction and subAction then local key = tonumber(mainAction) itemedit.Components[key][subAction] = Value print(sender.Name .. " edited '" .. itemedit.Name .. "' " .. removePeriodsAndNumbers(ActionString) .. " to " .. valueStringOutput) elseif ActionString == "Move" then Value2 = tonumber(ValueString2) or ValueString2 itemedit.Move(Vector2(Value, Value2), false) print(sender.Name .. " moved '" .. itemedit.Name .. "' by x" .. valueStringOutput .. " And y" .. ValueString2) else itemedit[ActionString] = Value print(sender.Name .. " edited '" .. itemedit.Name .. "' " .. removePeriodsAndNumbers(ActionString) .. " to " .. valueStringOutput) end local itemupdatetoclient = Networking.Start("itemupdatetoclients") itemupdatetoclient.WriteString(itemupdatestring) Networking.Send(itemupdatetoclient) end) Networking.Receive("serversettingsstart", function () if not File.Exists(EditGUI.Path .. "/settings.json") then File.Write(EditGUI.Path .. "/settings.json", json.serialize(dofile(EditGUI.Path .. "/Lua/defaultsettings.lua"))) end -- Load the settings from file local Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) -- Serialize the settings table into a string local serializedData = "" for key, value in pairs(Settings) do serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" end -- Send the serialized settings data over the network local settingsnetwork = Networking.Start("settingsnetworking") settingsnetwork.WriteString(serializedData) Networking.Send(settingsnetwork) end) Networking.Receive("settingsnetworkupdate", function (settingsnetwork,sender) if not sender.HasPermission(ClientPermissions.All) then return end local receivedData = settingsnetwork.ReadString() local Settingsupdate = {} for key, value in string.gmatch(receivedData, '([^;]+)=([^;]+)') do if value == "true" then Settingsupdate[key] = true elseif value == "false" then Settingsupdate[key] = false else Settingsupdate[key] = tonumber(value) or value end end File.Write(EditGUI.Path .. "/settings.json", json.serialize(Settingsupdate)) -- Load the settings from file local Settings = json.parse(File.Read(EditGUI.Path .. "/settings.json")) -- Serialize the settings table into a string local serializedData = "" for key, value in pairs(Settings) do serializedData = serializedData .. key .. "=" .. tostring(value) .. ";" end -- Send the serialized settings data over the network local settingsnetwork = Networking.Start("settingsnetworking") settingsnetwork.WriteString(serializedData) Networking.Send(settingsnetwork) end) Networking.Receive("servermsgstart", function (itemeditnetwork,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end local itemedit = Entity.FindEntityByID(itemeditnetwork.ReadUInt16()) itemedit.SpriteDepth = itemeditnetwork.ReadSingle() itemedit.Rotation = itemeditnetwork.ReadSingle() itemedit.Scale = itemeditnetwork.ReadSingle() itemedit.Condition = itemeditnetwork.ReadSingle() itemedit.Tags = itemeditnetwork.ReadString() itemedit.NonInteractable = itemeditnetwork.ReadBoolean() itemedit.NonPlayerTeamInteractable = itemeditnetwork.ReadBoolean() itemedit.InvulnerableToDamage = itemeditnetwork.ReadBoolean() itemedit.DisplaySideBySideWhenLinked = itemeditnetwork.ReadBoolean() itemedit.HiddenInGame = itemeditnetwork.ReadBoolean() Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("SpriteDepth")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Rotation")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Scale")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Condition")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("Tags")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("NonInteractable")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("NonPlayerTeamInteractable")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("InvulnerableToDamage")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("DisplaySideBySideWhenLinked")], itemedit)) Networking.CreateEntityEvent(itemedit, Item.ChangePropertyEventData(itemedit.SerializableProperties[Identifier("HiddenInGame")], itemedit)) end) Networking.Receive("flipxnetwork", function (mirrorx,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end local itemedit = Entity.FindEntityByID(mirrorx.ReadUInt16()) if itemedit then itemedit.FlipX(false) print(sender.Name .. " MirroredX '" .. itemedit.Name .. "'") local flipx = Networking.Start("flipxclientnetwork") flipx.WriteUInt16(UShort(itemedit.ID)) Networking.Send(flipx) end end) Networking.Receive("flipynetwork", function (mirrory,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end local itemedit = Entity.FindEntityByID(mirrory.ReadUInt16()) if itemedit then itemedit.FlipY(false) print(sender.Name .. " MirroredY '" .. itemedit.Name .. "'") local flipy = Networking.Start("flipyclientnetwork") flipy.WriteUInt16(UShort(itemedit.ID)) Networking.Send(flipy) end end) Networking.Receive("linkremove", function (msg,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) LinkRemove(itemedit1, itemedit2) print(sender.Name .. " unlinked '" .. itemedit1.Name .. "' and '" .. itemedit2.Name .. "'") local msg = Networking.Start("lualinker.remove") msg.WriteUInt16(UShort(itemedit1.ID)) msg.WriteUInt16(UShort(itemedit2.ID)) Networking.Send(msg) end) Networking.Receive("linkadd", function (msg,sender) if EditGUI.Settings.permissionsetting == 0 then if sender.Permissions == 0 then return end else if not sender.HasPermission(ClientPermissions[EditGUI.Settings.permissionsetting]) then return end end local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) LinkAdd(itemedit1, itemedit2) print(sender.Name .. " linked '" .. itemedit1.Name .. "' and '" .. itemedit2.Name .. "'") local msg = Networking.Start("lualinker.add") msg.WriteUInt16(UShort(itemedit1.ID)) msg.WriteUInt16(UShort(itemedit2.ID)) Networking.Send(msg) end) end -- Server Side End -- -- Client Side Start -- if CLIENT and Game.IsMultiplayer then local function split(str, separator) if str == nil then return {} -- Return an empty table for an empty string end local result = {} local pattern = string.format("([^%s]+)", separator) str:gsub(pattern, function(c) result[#result + 1] = c end) return result end Networking.Receive("itemupdatetoclients", function (itemupdatetoclient) itemupdatestring = itemupdatetoclient.ReadString() local values = split(itemupdatestring, "|") local ItemString = values[1] local ActionString = values[2] local ValueString = values[3] if values[4] then ValueString2 = values[4] else ValueString2 = nil end -- Perform the logic on the server local itemedit = Entity.FindEntityByID(tonumber(ItemString)) local Value = nil if ValueString == "true" then Value = true elseif ValueString == "false" then Value = false elseif ValueString2 == "Color" then local colorValues = split(ValueString , ",") if #colorValues == 4 then Value = Color(tonumber(colorValues[1]), tonumber(colorValues[2]), tonumber(colorValues[3]), tonumber(colorValues[4])) end elseif ValueString2 == "RequiredItems" then Value = ConvertStringToRequiredItems(ValueString) else Value = tonumber(ValueString) or ValueString end local mainAction, subAction = ActionString:match("(.-)%.([^%.]+)$") if mainAction and subAction then local key = tonumber(mainAction) itemedit.Components[key][subAction] = Value elseif ActionString == "Move" then Value2 = tonumber(ValueString2) or ValueString2 itemedit.Move(Vector2(Value, Value2), false) else itemedit[ActionString] = Value end end) Networking.Send(Networking.Start("serversettingsstart")) Networking.Receive("flipxclientnetwork", function (flipx) local itemedit = Entity.FindEntityByID(flipx.ReadUInt16()) if itemedit then itemedit.FlipX(false) end end) Networking.Receive("flipyclientnetwork", function (flipy) local itemedit = Entity.FindEntityByID(flipy.ReadUInt16()) if itemedit then itemedit.FlipY(false) end end) Networking.Receive("lualinker.add", function (msg) local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) LinkAdd(itemedit1, itemedit2) if links == true then Links() end end) Networking.Receive("lualinker.remove", function (msg) local itemedit1 = Entity.FindEntityByID(msg.ReadUInt16()) local itemedit2 = Entity.FindEntityByID(msg.ReadUInt16()) LinkRemove(itemedit1, itemedit2) if links == true then Links() end end) end -- Client Side End --