89b91d1c3e
# Conflicts: # Barotrauma/BarotraumaClient/ClientSource/Characters/Character.cs # Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs # Barotrauma/BarotraumaClient/ClientSource/GUI/Store.cs # Barotrauma/BarotraumaClient/ClientSource/Items/Inventory.cs # Barotrauma/BarotraumaClient/ClientSource/Items/Item.cs # Barotrauma/BarotraumaClient/ClientSource/Map/Map/Radiation.cs # Barotrauma/BarotraumaClient/ClientSource/Map/MapEntity.cs # Barotrauma/BarotraumaClient/ClientSource/Networking/ServerList/ServerInfo.cs # Barotrauma/BarotraumaClient/ClientSource/Screens/MainMenuScreen/MainMenuScreen.cs # Barotrauma/BarotraumaClient/ClientSource/Screens/ServerListScreen/ServerListScreen.cs # Barotrauma/BarotraumaClient/ClientSource/Screens/SubEditorScreen.cs # Barotrauma/BarotraumaClient/ClientSource/Serialization/SerializableEntityEditor.cs # Barotrauma/BarotraumaClient/ClientSource/Settings/SettingsMenu.cs # Barotrauma/BarotraumaClient/ClientSource/SpamServerFilter.cs # Barotrauma/BarotraumaClient/ClientSource/Sprite/Sprite.cs # Barotrauma/BarotraumaClient/ClientSource/Steam/Lobby.cs # Barotrauma/BarotraumaClient/LinuxClient.csproj # Barotrauma/BarotraumaClient/MacClient.csproj # Barotrauma/BarotraumaClient/WindowsClient.csproj # Barotrauma/BarotraumaServer/LinuxServer.csproj # Barotrauma/BarotraumaServer/MacServer.csproj # Barotrauma/BarotraumaServer/ServerSource/GameMain.cs # Barotrauma/BarotraumaServer/ServerSource/Steam/SteamManager.cs # Barotrauma/BarotraumaServer/ServerSource/Traitors/TraitorManager.cs # Barotrauma/BarotraumaServer/WindowsServer.csproj # Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/HumanoidAnimController.cs # Barotrauma/BarotraumaShared/SharedSource/Characters/Animation/Ragdoll.cs # Barotrauma/BarotraumaShared/SharedSource/DebugConsole.cs # Barotrauma/BarotraumaShared/SharedSource/Extensions/IEnumerableExtensions.cs # Barotrauma/BarotraumaShared/SharedSource/GameSession/GameModes/CampaignMode.cs # Barotrauma/BarotraumaShared/SharedSource/Items/ItemPrefab.cs # Barotrauma/BarotraumaShared/SharedSource/Map/Map/Location.cs # Barotrauma/BarotraumaShared/SharedSource/Serialization/Editable/ConditionallyEditable.cs # Barotrauma/BarotraumaShared/SharedSource/Settings/GameSettings.cs # Barotrauma/BarotraumaShared/changelog.txt # Libraries/BarotraumaLibs/BarotraumaCore/Utils/MathUtils.cs
110 lines
4.8 KiB
C#
110 lines
4.8 KiB
C#
using Barotrauma.Items.Components;
|
|
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Xml.Linq;
|
|
|
|
namespace Barotrauma
|
|
{
|
|
partial class ItemAssemblyPrefab : MapEntityPrefab
|
|
{
|
|
public void DrawIcon(SpriteBatch spriteBatch, GUICustomComponent guiComponent)
|
|
{
|
|
Rectangle drawArea = guiComponent.Rect;
|
|
|
|
float scale = Math.Min(drawArea.Width / (float)Bounds.Width, drawArea.Height / (float)Bounds.Height) * 0.9f;
|
|
|
|
foreach ((Identifier identifier, Rectangle rect) in DisplayEntities)
|
|
{
|
|
var entityPrefab = FindByIdentifier(identifier);
|
|
if (entityPrefab is CoreEntityPrefab || entityPrefab == null) { continue; }
|
|
var drawRect = new Rectangle(
|
|
(int)(rect.X * scale) + drawArea.Center.X, (int)((rect.Y) * scale) - drawArea.Center.Y,
|
|
(int)(rect.Width * scale), (int)(rect.Height * scale));
|
|
entityPrefab.DrawPlacing(spriteBatch, drawRect, entityPrefab.Scale * scale);
|
|
}
|
|
}
|
|
|
|
public override void DrawPlacing(SpriteBatch spriteBatch, Camera cam)
|
|
{
|
|
base.DrawPlacing(spriteBatch, cam);
|
|
foreach ((Identifier identifier, Rectangle rect) in DisplayEntities)
|
|
{
|
|
var entityPrefab = FindByIdentifier(identifier);
|
|
if (entityPrefab == null) { continue; }
|
|
Rectangle drawRect = rect;
|
|
drawRect.Location += placePosition != Vector2.Zero ? placePosition.ToPoint() : Submarine.MouseToWorldGrid(cam, Submarine.MainSub).ToPoint();
|
|
entityPrefab.DrawPlacing(spriteBatch, drawRect, entityPrefab.Scale);
|
|
}
|
|
}
|
|
|
|
public static XElement Save(List<MapEntity> entities, string name, string description, bool hideInMenus = false)
|
|
{
|
|
XElement element = new XElement("ItemAssembly",
|
|
new XAttribute("name", name),
|
|
new XAttribute("description", description),
|
|
new XAttribute("hideinmenus", hideInMenus));
|
|
|
|
|
|
//move the entities so that their "center of mass" is at {0,0}
|
|
var assemblyEntities = MapEntity.CopyEntities(entities);
|
|
|
|
//find wires and items that are contained inside another item
|
|
//place them at {0,0} to prevent them from messing up the origin of the prefab and to hide them in preview
|
|
List<MapEntity> disabledEntities = new List<MapEntity>();
|
|
foreach (MapEntity mapEntity in assemblyEntities)
|
|
{
|
|
if (mapEntity is Item item)
|
|
{
|
|
var wire = item.GetComponent<Wire>();
|
|
if (item.ParentInventory != null ||
|
|
(wire != null && wire.Connections.Any(c => c != null)))
|
|
{
|
|
item.SetTransform(Vector2.Zero, 0.0f);
|
|
disabledEntities.Add(mapEntity);
|
|
}
|
|
}
|
|
}
|
|
|
|
float minX = int.MaxValue, maxX = int.MinValue;
|
|
float minY = int.MaxValue, maxY = int.MinValue;
|
|
foreach (MapEntity mapEntity in assemblyEntities)
|
|
{
|
|
if (disabledEntities.Contains(mapEntity)) { continue; }
|
|
minX = Math.Min(minX, mapEntity.WorldRect.X);
|
|
maxX = Math.Max(maxX, mapEntity.WorldRect.Right);
|
|
minY = Math.Min(minY, mapEntity.WorldRect.Y - mapEntity.WorldRect.Height);
|
|
maxY = Math.Max(maxY, mapEntity.WorldRect.Y);
|
|
}
|
|
Vector2 center = new Vector2((minX + maxX) / 2.0f, (minY + maxY) / 2.0f);
|
|
if (Submarine.MainSub != null) { center -= Submarine.MainSub.HiddenSubPosition; }
|
|
|
|
Vector2 offsetFromGrid = new Vector2(
|
|
MathUtils.RoundTowardsClosest(center.X, Submarine.GridSize.X) - center.X,
|
|
MathUtils.RoundTowardsClosest(center.Y, Submarine.GridSize.Y) - center.Y - Submarine.GridSize.Y / 2);
|
|
|
|
MapEntity.SelectedList.Clear();
|
|
entities.ForEach(e => MapEntity.AddSelection(e));
|
|
|
|
foreach (MapEntity mapEntity in assemblyEntities)
|
|
{
|
|
mapEntity.Move(-center - offsetFromGrid);
|
|
mapEntity.Submarine = Submarine.MainSub;
|
|
var entityElement = mapEntity.Save(element);
|
|
if (disabledEntities.Contains(mapEntity))
|
|
{
|
|
entityElement.Add(new XAttribute("hideinassemblypreview", "true"));
|
|
}
|
|
}
|
|
|
|
//restore the previous selection
|
|
MapEntity.SelectedList.Clear();
|
|
entities.ForEach(e => MapEntity.AddSelection(e));
|
|
|
|
return element;
|
|
}
|
|
}
|
|
}
|