2022-04-11 13:07:46 +02:00
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Xml.Serialization;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
using GTA;
|
|
|
|
|
using GTA.Math;
|
|
|
|
|
using GTA.Native;
|
|
|
|
|
|
|
|
|
|
namespace CoopClient
|
|
|
|
|
{
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
|
|
|
|
[XmlRoot(ElementName = "Map")]
|
|
|
|
|
public class CoopMap
|
2022-04-11 13:07:46 +02:00
|
|
|
|
{
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
[XmlArray("Props")]
|
|
|
|
|
[XmlArrayItem("Prop")]
|
2022-04-11 13:37:38 +02:00
|
|
|
|
public List<CoopProp> Props { get; set; } = new List<CoopProp>();
|
2022-04-11 13:07:46 +02:00
|
|
|
|
}
|
|
|
|
|
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
|
|
|
|
public struct CoopProp
|
2022-04-11 13:07:46 +02:00
|
|
|
|
{
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
public Vector3 Position { get; set; }
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
public Vector3 Rotation { get; set; }
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
public int Hash { get; set; }
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
public bool Dynamic { get; set; }
|
2022-04-11 13:37:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
///
|
|
|
|
|
/// </summary>
|
2022-04-11 13:07:46 +02:00
|
|
|
|
public int Texture { get; set; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static class MapLoader
|
|
|
|
|
{
|
|
|
|
|
// string = file name
|
2022-04-11 13:37:38 +02:00
|
|
|
|
private static readonly Dictionary<string, CoopMap> _maps = new Dictionary<string, CoopMap>();
|
2022-04-11 13:07:46 +02:00
|
|
|
|
private static readonly List<int> _createdObjects = new List<int>();
|
|
|
|
|
|
|
|
|
|
public static void LoadAll()
|
|
|
|
|
{
|
|
|
|
|
string downloadFolder = $"scripts\\resources\\{Main.MainSettings.LastServerAddress.Replace(":", ".")}";
|
|
|
|
|
|
|
|
|
|
if (!Directory.Exists(downloadFolder))
|
|
|
|
|
{
|
|
|
|
|
Directory.CreateDirectory(downloadFolder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string[] files = Directory.GetFiles(downloadFolder, "*.xml");
|
|
|
|
|
lock (_maps)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < files.Length; i++)
|
|
|
|
|
{
|
|
|
|
|
string filePath = files[i];
|
|
|
|
|
|
2022-04-11 13:37:38 +02:00
|
|
|
|
XmlSerializer serializer = new XmlSerializer(typeof(CoopMap));
|
|
|
|
|
CoopMap map;
|
2022-04-11 13:07:46 +02:00
|
|
|
|
|
|
|
|
|
using (var stream = new FileStream(filePath, FileMode.Open))
|
|
|
|
|
{
|
2022-04-11 13:37:38 +02:00
|
|
|
|
map = (CoopMap)serializer.Deserialize(stream);
|
2022-04-11 13:07:46 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GTA.UI.Notification.Show($"{map.Props.Count()}");
|
|
|
|
|
|
|
|
|
|
string fileName = Path.GetFileName(filePath);
|
|
|
|
|
_maps.Add(fileName, map);
|
|
|
|
|
|
|
|
|
|
GTA.UI.Notification.Show($"test: {_maps["ATV.xml"].Props.Count()}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//GTA.UI.Notification.Show($"{_maps["ATV.xml"].Objects[0].Position.X}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void LoadMap(string name)
|
|
|
|
|
{
|
|
|
|
|
lock (_maps) lock (_createdObjects)
|
|
|
|
|
{
|
|
|
|
|
if (!_maps.ContainsKey(name) || _createdObjects.Count != 0)
|
|
|
|
|
{
|
|
|
|
|
GTA.UI.Notification.Show($"The map with the name \"{name}\" couldn't be loaded!");
|
2022-04-11 13:37:38 +02:00
|
|
|
|
Logger.Write($"The map with the name \"{name}\" couldn't be loaded!", Logger.LogLevel.Server);
|
2022-04-11 13:07:46 +02:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-11 13:37:38 +02:00
|
|
|
|
CoopMap map = _maps[name];
|
2022-04-11 13:07:46 +02:00
|
|
|
|
|
|
|
|
|
for (int i = 0; i < map.Props.Count(); i++)
|
|
|
|
|
{
|
2022-04-11 13:37:38 +02:00
|
|
|
|
CoopProp prop = map.Props[i];
|
2022-04-11 13:07:46 +02:00
|
|
|
|
|
|
|
|
|
Model model = prop.Hash.ModelRequest();
|
|
|
|
|
if (model == null)
|
|
|
|
|
{
|
|
|
|
|
Logger.Write($"Model for object \"{model.Hash}\" couldn't be loaded!", Logger.LogLevel.Server);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int handle = Function.Call<int>(Hash.CREATE_OBJECT, model.Hash, prop.Position.X, prop.Position.Y, prop.Position.Z, 1, 1, prop.Dynamic);
|
|
|
|
|
if (handle == 0)
|
|
|
|
|
{
|
|
|
|
|
Logger.Write($"Object \"{model.Hash}\" couldn't be created!", Logger.LogLevel.Server);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
model.MarkAsNoLongerNeeded();
|
|
|
|
|
|
|
|
|
|
_createdObjects.Add(handle);
|
|
|
|
|
|
|
|
|
|
if (prop.Texture > 0 && prop.Texture < 16)
|
|
|
|
|
{
|
|
|
|
|
Function.Call(Hash._SET_OBJECT_TEXTURE_VARIATION, handle, prop.Texture);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Logger.Write($"Object [{model.Hash}] created at {prop.Position.X}, {prop.Position.Y}, {prop.Position.Z}", Logger.LogLevel.Server);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool AnyMapLoaded()
|
|
|
|
|
{
|
|
|
|
|
return _createdObjects.Any();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void DeleteMap()
|
|
|
|
|
{
|
|
|
|
|
lock (_createdObjects)
|
|
|
|
|
{
|
|
|
|
|
foreach (int handle in _createdObjects)
|
|
|
|
|
{
|
|
|
|
|
unsafe
|
|
|
|
|
{
|
|
|
|
|
int tmpHandle = handle;
|
|
|
|
|
Function.Call(Hash.DELETE_OBJECT, &tmpHandle);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_createdObjects.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void DeleteAll()
|
|
|
|
|
{
|
|
|
|
|
DeleteMap();
|
|
|
|
|
lock (_maps)
|
|
|
|
|
{
|
|
|
|
|
_maps.Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|