Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaClient/ClientSource/Map/ItemAssemblyPrefab.cs
T
Regalis11 89b91d1c3e Merge branch 'master' into dev
# 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
2024-04-24 17:38:13 +03:00

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;
}
}
}