import * as xml2js from 'xml2js';
import fs from 'fs';
import path from 'path';
class Vector3 {
constructor(public x: number, public y: number, public z: number) {}
}
declare namespace mp {
export const objects: any;
// Определение класса Vector3
export class Vector3 {
constructor(x: number, y: number, z: number);
}
}
interface PositionRotation {
X: [string];
Y: [string];
Z: [string];
Pitch?: [string];
Roll?: [string];
Yaw?: [string];
}
interface Placement {
ModelHash?: string[];
Type?: string[];
Dynamic?: string[];
FrozenPos?: string[];
HashName?: string[];
InitialHandle?: string[];
ObjectProperties?: { TextureVariation: string[] }[];
OpacityLevel?: string[];
LodDistance?: string[];
IsVisible?: string[];
MaxHealth?: string[];
Health?: string[];
HasGravity?: string[];
IsOnFire?: string[];
IsInvincible?: string[];
IsBulletProof?: string[];
IsCollisionProof?: string[];
IsExplosionProof?: string[];
IsFireProof?: string[];
IsMeleeProof?: string[];
IsOnlyDamagedByPlayer?: string[];
PositionRotation?: PositionRotation[];
Attachment?: { isAttached: string[] }[];
}
interface SpoonerPlacements {
Note?: string;
AudioFile?: { volume: string };
ClearDatabase?: string;
ClearWorld?: string;
ClearMarkers?: string;
IPLsToLoad?: { load_mp_maps: string; load_sp_maps: string };
IPLsToRemove?: string[];
WeatherToSet?: string;
StartTaskSequencesOnLoad?: string;
ReferenceCoords?: {
X: string;
Y: string;
Z: string;
};
Placement?: Placement[] | Placement;
}
async function loadXML(filePath: string): Promise<SpoonerPlacements> {
const xmlData = fs.readFileSync(filePath, 'utf-8');
return new Promise((resolve, reject) => {
xml2js.parseString(xmlData, { explicitArray: false }, (err, result) => {
if (err) {
reject(err);
} else {
resolve(result as SpoonerPlacements);
}
});
});
}
async function processXML(xmlData: SpoonerPlacements): Promise<mp.objects.Object[] | null> {
const spoonerPlacements = xmlData as SpoonerPlacements;
if (!spoonerPlacements || !spoonerPlacements.SpoonerPlacements.Placement) {
console.error('Неверный формат данных в XML');
return null;
}
const placements = Array.isArray(spoonerPlacements.SpoonerPlacements.Placement)
? spoonerPlacements.SpoonerPlacements.Placement
: [spoonerPlacements.SpoonerPlacements.Placement];
const createdObjects: mp.objects.Object[] = [];
for (const item of placements) {
console.log('ModelHash:', item.ModelHash);
console.log('PositionRotation:', item.PositionRotation);
}
return createdObjects.length ? createdObjects : null;
}
const filePath = path.join(__dirname, 'maps/city.xml');
async function parseObj() {
// Вызов функции загрузки XML и обработки данных
try {
const xmlData = await loadXML(filePath);
const parsedData = await processXML(xmlData);
console.log(parsedData);
} catch (error) {
console.error('Ошибка при обработке XML:', error);
}
}
parseObj();