Alex Rinic 21 Опубликовано 26 Июля 2015 (изменено) Доброго времени суток. Дело было вечером, делать было нечего ... Как-то мне понадобилось в чистом небе создать мобов, не привязанных к отряду. Причём появление их должно было происходить при определённых событиях. Но есть одна загвоздка - файлы логики смарт террейнов не понимают знаков . и * - а значит и координат с плавающей запятой. Я бился над проблемой долго - минут пятнадцать. На платформе движка сталкера в скриптах Lua существует возможность представить число в виде Экспоненциальной записи с целочисленной мантиссой - знака, мантиссы и порядка, например -1000000.5050 = [(-1)^1]*10000005050*[10^(-4)] где единичка в первой квадратной скобке - знак(если 0 то число положительное, если 1 то отрицательное),10000005050 - целочисленная мантисса, а 4 - порядок, или позиция запятой. Например, надо представить текстовую последовательность в виде дробного числа, имеем : [функция1]([знак1], [мантисса1], [позиция1]) возвращает [число1] в виде результата. Например : [функция1](0, 1024, 2) вернёт 10.24 в качестве результата, а [функция1](1, 16384, 3) вернёт -16.384 в качестве результата.Таким образом, для преобразования набора чисел в координаты вектора для расположения npc/монстра, можно использовать такую нетрадиционную форму записи.В результате для функции alife():create([spawn_section],vector:set([pos:x],[pos:y],[pos:z]),[level vertex],[game vertex]) нужно12 параметров, первый - название секции npc/монстра, следующие девять - группами по три штуки - координаты вектора/позиция, ещё два - номера вертексов. Как реализовать - Допустим, нам надо поставить на уровень свободногуляющую псевдособаку. после снятия координат имеем : position = -17.3546578934,25.1254873567,-54.5484768934 game_vertex_id = 173 level_vertex_id = 429 Приводим всё это дело к нужному виду : - выписываем с точностью до шестого, или седьмого знака - [-17.3546578, 25.1254873, -54.5484768 429 173] [1:173546578:7, 0:251254873:7, 1:545484768:7 429 173] Лезем в файл gamedata\scripts\xr_effects.script - и там пролистываем в самый конец, пишем функцию появления монстрятины function spawn_mob_at_pos(actor, obj, p) local spsec,valx,xset,xdigit,valy,yset,ydigit,valz,zset,zdigit,lvert,gvert = tostring(p[1]),tonumber(p[2]),tonumber(p[3]),tonumber(p[4]),tonumber(p[5]),tonumber(p[6]),tonumber(p[7]),tonumber(p[8]),tonumber(p[9]),tonumber(p[10]),tonumber(p[11]),tonumber(p[12]) local vnsetx = ( (-1)^valx ) * xset * ( 10^(-xdigit) ) local vnsety = ( (-1)^valy ) * yset * ( 10^(-ydigit) ) local vnsetz = ( (-1)^valz ) * zset * ( 10^(-zdigit) ) local vnset = vector():set(vnsetx,vnsety,vnsetz) alife():create(spsec,vnset,lvert,gvert) end Пишем логику - [sr_idle@scene_dogs_time] on_timer = 4000 | %=spawn_mob_at_pos(pseudodog_normal:1:173546578:7:0:251254873:7:1:545484768:7:429:173)% Заходим в игру, наблюдаем результат. Изменено 31 Июля 2015 пользователем Kirgudu 1 4 Поделиться этим сообщением Ссылка на сообщение