Приветствую. Пытаюсь добавить мапинг на сервер с помощью TS.
С моддингом я сталкиваюсь впервые, по этому есть некоторые вопросы.
Как правильно добавлять объекты, возможно есть более простое решение?
Я написал скрипт который должен создавать объекты на карте при старте сервера, в логах я вижу что они создаются но на сервере их по каким то причинам не видно.
TypeScript
.xml фаил в формате:
Консоль запуска:
Что я делаю не так?
С моддингом я сталкиваюсь впервые, по этому есть некоторые вопросы.
Как правильно добавлять объекты, возможно есть более простое решение?
Я написал скрипт который должен создавать объекты на карте при старте сервера, в логах я вижу что они создаются но на сервере их по каким то причинам не видно.
TypeScript
Код:
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 = await Promise.all(placements.map(async (item: any) => {
if (item.ModelHash && item.PositionRotation && item.PositionRotation.X && item.PositionRotation.Y && item.PositionRotation.Z && item.PositionRotation.Yaw) {
const myObjects = mp.objects.new(item.ModelHash, new mp.Vector3(item?.PositionRotation?.X,item?.PositionRotation?.Y,item?.PositionRotation?.Z), {
rotation: new mp.Vector3(0, 0, item?.PositionRotation?.Yaw),
alpha: 255,
dimension: 0,
});
return myObjects.id;
} else {
console.error('Неверный формат данных для создания объекта:', item);
return null;
}
}));
return createdObjects;
}
const filePath = path.join(__dirname, 'maps/city.xml');
async function createObj() {
// Вызов функции загрузки XML и обработки данных
try {
const xmlData = await loadXML(filePath);
const parsedData = await processXML(xmlData);
console.log(parsedData);
} catch (error) {
console.error('Ошибка при обработке XML:', error);
}
}
createObj();
Код:
<Placement>
<ModelHash>0x376cb307</ModelHash>
<Type>3</Type>
<Dynamic>false</Dynamic>
<FrozenPos>true</FrozenPos>
<HashName>prop_rub_buswreck_06</HashName>
<InitialHandle>381954</InitialHandle>
<ObjectProperties>
<TextureVariation>0</TextureVariation>
</ObjectProperties>
<OpacityLevel>255</OpacityLevel>
<LodDistance>16960</LodDistance>
<IsVisible>true</IsVisible>
<MaxHealth>1000</MaxHealth>
<Health>0</Health>
<HasGravity>true</HasGravity>
<IsOnFire>false</IsOnFire>
<IsInvincible>false</IsInvincible>
<IsBulletProof>false</IsBulletProof>
<IsCollisionProof>false</IsCollisionProof>
<IsExplosionProof>false</IsExplosionProof>
<IsFireProof>false</IsFireProof>
<IsMeleeProof>false</IsMeleeProof>
<IsOnlyDamagedByPlayer>false</IsOnlyDamagedByPlayer>
<PositionRotation>
<X>-184.888977</X>
<Y>-899.207703</Y>
<Z>28.4471703</Z>
<Pitch>3.18055451e-14</Pitch>
<Roll>-5.41569989e-07</Roll>
<Yaw>9.24961281</Yaw>
</PositionRotation>
<Attachment isAttached="false" />
</Placement>
Консоль запуска:
Код:
[DONE] "server" package has been loaded.
[INFO] Starting packages...
[DONE] Server packages have been started.
[
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99,
... 231 more items
]
Что я делаю не так?