ASSISTANT
Конечно! Используя `getMappetNpc`, вы можете управлять NPC в мире. Предположим, у вас есть уникальный идентификатор NPC, и вы хотите переспавнить его каждый раз, когда данные обновляются.
Вот пример полного скрипта с использованием `getMappetNpc`:
```javascript
function deleteKeyFromString(str, key) {
var regex = new RegExp(key + ":[^,]*,?", "g");
return str.replace(regex, "").replace(/,$/g, '');
}
function deleteKeyAndUpdateState(c, keyToDelete) {
var states = c.getServer().getStates();
var currentStateString = states.getString("state_1");
var newStateString = deleteKeyFromString(currentStateString, keyToDelete);
states.setString("state_1", newStateString);
c.send("Обновлено state_1:", newStateString);
// Здесь мы перерождаем NPC
respawnNpc(c, "npc_id"); // убедитесь, что вы заменили "npc_id" на реальный ID вашего NPC
}
function respawnNpc(c, npcId) {
var world = c.getWorld();
var npc = world.getMappetNpc(npcId);
if (npc) {
// Удалить текущего NPC
npc.kill();
// Создать нового NPC
var spawnPosition = npc.getPosition();
var newNpc = world.createNpc(npcId, spawnPosition.x, spawnPosition.y, spawnPosition.z);
if (newNpc) {
c.send("NPC перерожден на позиции: ", spawnPosition);
} else {
c.send("Ошибка при перерождении NPC.");
}
} else {
c.send("NPC с ID " + npcId + " не найден.");
}
}
function main(c) {
var states = c.getServer().getStates();
var str = states.getString("state_1");
var s = c.getSubject();
var result = parseKeyValueString(str);
var displayNames = Object.keys(result);
var ui = mappet.createUI(c, "handler").background();
var strings = ui.stringList(displayNames).id("strings").tooltip("Нажмите для получения информации...");
var label = ui.label("...").id("fruit").visible(false);
var layout = ui.layout();
layout.getCurrent().rxy(0.5, 0.5).wh(400, 400).anchor(0.5);
var morph = mappet.createMorph("{Skin:\"b.a:empty/skins/texture.png\",Settings:{Hands:1b},Name:\"blockbuster.empty\"}");
var char = layout.morph(morph).id("char")
char.rxy(0.5, 0.45).wh(250, 340).anchor(0.5).position(0.027, 1.4, 0.019).rotation(0, -35).distance(2.5).fov(65).enabled(true);
var takeButton = ui.button("Забрать").id("take").background(0x426242);
takeButton.rxy(0.5, 0.9).wh(100, 20).anchor(0.5);
strings.background(0x88000000).rxy(0.3, 0.5).wh(100, 240).anchor(0.5);
label.rx(0.5).ry(0.5, -160).anchor(0.5, 0.5);
label.background(0x28000000).labelAnchor(0.5, 0.5);
s.openUI(ui);
}
function handler(c) {
var states = c.getServer().getStates();
var str = states.getString("state_1");
var result = parseKeyValueString(str);
var blockNames = Object.keys(result);
var uiContext = c.getSubject().getUIContext();
var data = uiContext.getData();
var s = c.getSubject();
var pos = c.getPlayer().getPosition();
var last = uiContext.getLast();
var player = c.getPlayer();
if (last === "strings") {
var selectedDisplayName = data.getString("strings");
var blockCode = result[selectedDisplayName] || "minecraft:stone";
var new_morph = mappet.createMorph("{Name:\"item\",Stack:{id:\"" + blockCode +"\",Count:1b,Damage:0s}}");
uiContext.get("fruit").label(data.getString("strings")).visible(true);
uiContext.get("char").morph(new_morph);
s.playSound("minecraft:ui.button.click", pos.x, pos.y, pos.z, 1, 2);
}
if (last === "take") {
var selectedDisplayName = data.getString("strings");
if (selectedDisplayName) {
var blockCode = result[selectedDisplayName] || "minecraft:stone";
player.giveItem(mappet.createItem(blockCode));
s.closeUI();
s.playSound("minecraft:ui.button.click", pos.x, pos.y, pos.z, 1, 2);
deleteKeyAndUpdateState(c, selectedDisplayName);
}
}
}
function parseKeyValueString(str) {
let result = {};
let pairs = str.split(",");
for (let pair of pairs) {
let [key, value] = pair.split(":");
if (key && value) {
result[key] = value;
}
}
return result;
}
```
Этот скрипт обновляет `state_1`, удаляет выбранный элемент, и в это же время перерождает соответствующего NPC, используя метод `getMappetNpc`. Убедитесь, что вы заменили `"npc_id"` на настоящий идентификатор вашего NPC.