Artos Не нужно также забывать, что помимо индивидуальных сеток координат position для каждой локации, (по сути это координаты относительно моделей локаций), мы имеем и общеигровую сетку game_position ( на которую все локации и накладываются). Правда её применений в игре я не замечал. Гейм_вертексы, это площади определённых размеров, установленных на общеигровой сетке, когда левел_вертексы, это площади меньших размеров чем гейм_вертексы, установленых на сетках локаций. По сути, все эти вертексы, это тоже своеобразные сетки в виде площадей используемые для перемещения мобов в online и в offline.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Вообще задача конкретная, надо знать, что может твориться с вертексами в радиусе 250 метров вокруг ГГ.
Ситуация такая: надо посчитать параметры точки в "упоре указателя" (это там где дальномер).
С level_vertex-ом вроде проблем нет - level.vertex_in_direction(). А вот как получить game_vertex для точки с известными position и level_vertex (в условиях ограничения 250 метров от ГГ) - пока не понятно.
отредактировал(а) MRN$: 22-08-2010 15:34 GMT3 час. всё легко
singapur22
Собственно никто и не забывает ...
Моя, может быть несколько вольная трактовка о серии и номере паспорта, как раз и говорит о глобальной индексации и о 'вложенности' level в game. Естественно при смене локаций (точки перехода) требуется увязка локальных и игровых координат (level_graph'ов с game_graph'ами), но это уже следую**50026ea8aab1bb10eeba**дистанция сканирования
local vPosL = level.vertex_position(iLvid)
for id=iGvidMin, iGvidMax do
local vPosG = game_graph():vertex(id):game_point()
local iDist = vPosG:distance_to(vPosL)
if iDist < iDistMin then
iDistMin = iDist
iGvid = id
end
end
if iGvid and iGvid >= 0 and game_graph():valid_vertex_id(iGvid) then
return vPosL, iLvid, iGvid --/> координаты
end
[/code]P.P.S. Под 'game_position' singapur22 вероятно подразумевал 'game_graph' ...
Artos С вертексами ничего не может быть... диапазон гейм-вертексов заранее определен.
Это я понимаю.
Вопрос в том, как получить game_vertex для конкретной точки с известными position и level_vertex. Теоретически, в радиусе 250 метров от ГГ, может быть не меньше 4 гейм-вертексов - какой из них?
Тут про какой-то "game_position" написали пока про это ищу...
ЗЫ:
Функция взял - попробую...
Но для чего(?) дальномеру гейм-вертекс???
Это для одной "полезности". Например, что-бы точки путей и спавна не положением ГГ фиксировать, а указыванием.
MRN$
Подправь код, внеся в начало 'local iLvid, iGvid = Number, nil' - где 'Number' - тобою уже определенный идентификатор левел-вертекса.
Собственно для спавна (скриптом) гейм-вертекс далеко вторичен и в большинстве случаев может браться любой из диапазона данной локации! Важна позиция, вписывающаяся в доступный объекту левел-вертекс!
Artos Да собсно я просто упомянул про общеигровую сетку. А всё остальное, както само привязалось. :-)
'game_graph' или нет, я не могу сказать точно, так как я уже говорил, применений не нашёл, посему не могу точно знать, как их называют. Но вот метод определения координат на общеигровой сетке:
Собсно это будет определение вышеупомянутых координат по левел_вертексу.
MRN$ Мы уже разговаривали на эту тему. К сожалению методов определения координат по направлению (position ->> level_vertex_id ->> game_vertex_id) неимеется. Можно лишь произвести определения в обратном направлении ( game_vertex_id ->> level_vertex_id ->> position)
Если бы была возможность определения левел_вертексов по данным position, это решило бы очень много проблем. Например корректировка изначально неверно введённых координат в all.spawn
А так как возможности такоё не имеем, то и править приходится в ручную.
Да и вообще. Если бы был такой метод, нужда в левел_вертексах отпала бы вовсе.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
#erlik :...выходит, что практически любой вариант вставки через insert в таблицу значений по произвольным индексам таит возможность будущей ошибки при попытке обратиться по нужному(известному) индексу и получить его значениеsBox.id
Вот именно.
Есть зависимость, следуя которой при заполнении определенных полей (а также некоторого соответствия заполненных и пустых полей) таблица может становиться то числовым массивом, то хэшем.
Т.е. ты можешь вставить поле и оно будет читаться в массиве, а следующее вставиться, но массив
отредактировал(а) Gun12: 22-08-2010 17:24 GMT3 час. Не стань номинантом премии Дарвина.
Пробовал восстановить вырезанных монстров, начал с гражданских зомби. В начале новой игры выкидывает, без информации об ошибки. В буфере обмена также ничего нет.
Вот собственно файлы:
m_zombie.ltx
[m_zombie_e]:monster_base
GroupControlSection = spawn_group
SpaceRestrictionSection = space_restrictor,zone_mosquito_bald,zone_witches_galantine,zone_burning_fuzz1,zone_mincer,zone_gravi_zone
;$spawn = "monsters\zombies\zombie_base" ; option for Level Editor
$npc = on ; option for Level Editor
$prefetch = 16
Scheduled = on ; option for ALife Simulator
Human = off ; option for ALife Simulator
Health = 700 ; option for ALife Simulator
MinSpeed = 1.0 ; option for ALife Simulator
MaxSpeed = 5.0 ; option for ALife Simulator
going_speed = 2 ; option for ALife Simulator
search_speed = 1.5 ; option for ALife Simulator
visual = monsters\zombi\zombi_1
corpse_visual = monsters\zombi\zombi_1
icon = ui_npc_monster_zombie
;---------------------------------------------------------------------
ph_skeleton_airr_lin_factor = -0.40 (изменно из-за того, что убрано домножение коэффициент 0.002 из кода)
ph_skeleton_airr_ang_factor = -0.20 (изменно из-за того, что убрано домножение на коэффициент 0.3 из кода (0.0*0.3=0.0))
ph_skeleton_hinger_factor1 = 5.0 ;1.0 (изменно из-за того, что убрано домножение на коэффициент 5.0 из кода)
ph_skeleton_ddelay = 5.0 ;Время изменения значения трения в суставе с момента создания шелла, сек
min_view_distance = 0.7 ; коэффициент, который множится на eye_range, в зависимости от угла
max_view_distance = 1.0 ; коэффициент, который множится на eye_range, в зависимости от угла
visibility_threshold = 100.0 ; значение, при достижении суммой которого объект считается видимым
always_visible_distance = 0.3
time_quant = 0.001
decrease_value = 0.01 ; значение, на которое уменьшается вес, если объект попал в фрустум, но отсёкся по каким-то причинам
velocity_factor = 0.5
luminocity_factor = 0.5 ; фактор освещения (только для Актёра)
transparency_threshold = 0.25
terrain = zombie_terrain
hit_type = wound
;entity condition
; entity condition
satiety_v = 0.00001 ;скорость уменьшения сытости со временем
radiation_v = 0.00001 ;скорость уменьшения радиации
satiety_power_v = 0.01 ;увеличение силы при уменьшении сытости
satiety_health_v = 0.005 ;увеличение здоровья при уменьшении сытости
satiety_critical = -1.0 ;критическое значения сытости (в процентах от 0..1) когда здоровье начианает уменьшаться
radiation_health_v = 0.01 ;уменьшение здоровья при воздействии радиации
morale_v = 0.01 ;скорость восстановления морали
health_hit_part = 1.0 ;процент хита, уходящий на отнимание здоровья
power_hit_part = 1.0 ;процент хита, уходящий на отнимание силы
psy_health_v = 0.1 ;скорость восстановления psy-здоровья
immunities_sect = zombie_immunities
;открытые раны
bleeding_v = 0 ;потеря крови при номинальной ране в секунду
wound_incarnation_v = 0.01 ;крутизна кривой заживления (какой процент раны останется после заживления в игровую секунду)
min_wound_size = 0.01
----------------------------------------------
-- Спавн гражданских зомби на Кордоне
-- ver 0.1
-- by Stalker_AleX333
----------------------------------------------
local zombie_types = {"zombie_weak", zombie_normal", "zombie_strong", "zombie_immortal", "zombie_ghost"}
function spawn_zombies( position, total )
local zombie_index -- тип зомби из массива zombie_types
local new_pos, x_offset, z_offset -- объявляем переменные
for zombie_index=1, total do -- крутим цикл столько раз, сколько задает переменная total
x_offset = math.random(5) -- случайное (рандомное) x от 1 до 5
z_offset = math.random(5) -- случайное (рандомное) z от 1 до 5
new_pos = position -- передаем координаты в функцию
new_pos.x = new_pos.x + x_offset -- прибавляем к указанной нами координате x полученное выше рандомное x
new_pos.z = new_pos.z + z_offset -- прибавляем к указанной нами координате z полученное выше рандомное z
-- Ниже, собственно и вызывается функция спавна случайного типа зомби zombie_types[math.random(5)] привязанного к нашим координатам
alife():create(zombie_types[math.random(5)],new_pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
end
end
function zombie_story_1( actor, npc ) -- десять зомби на фабрике (Кордон)
local spawn_point = vector():set( 115, -6, -16 ) -- здесь хранятся координаты
spawn_zombies( spawn_point, 10 ) -- вызов предыдущей функции с передачей ей координат и количества объектов
end
function addKillCount(npc)
local props, sect = getNpcType(npc)
if props == nil then
return
end
local sect_name
if sect_alias[sect] ~= nil then
sect_name = sect_alias[sect]
else
sect_name = sect
end
if killCountProps[sect_name] == nil then
print_table(sect_alias)
abort("Statistic ERROR: required section [%s] not present, based [%s]", tostring(sect_name), tostring(sect))
end
actor_stats.add_points(props, sect_name, 1, killCountProps[sect_name])
db.actor:set_character_rank(db.actor:character_rank() + killCountProps[sect_name])
end
function getNpcType(npc)
if IsStalker(npc) then
local community = "neutral"
if npc:character_community() == "monolith" then community = "monolith"
elseif npc:character_community() == "military" then community = "military"
elseif npc:character_community() == "killer" then community = "killer"
elseif npc:character_community() == "ecolog" then community = "ecolog"
elseif npc:character_community() == "dolg" then community = "dolg"
elseif npc:character_community() == "freedom" then community = "freedom"
elseif npc:character_community() == "bandit" then community = "bandit"
elseif npc:character_community() == "zombied" then community = "zombied"
elseif npc:character_community() == "zombie" then community = "zombie"
end
local rank = ranks.get_obj_rank_name(npc)
return "stalkerkills", community.."_"..rank
else
local community = monster_classes[get_clsid(npc)]
if community == nil then
abort("Statistic ERROR: cannot find monstr class for [%s]", npc:name())
end
if community == "NIL" then
return nil,nil
end
local rank = ranks.get_obj_rank_name(npc)
return "monsterkills", community.."_"..rank
end
end
Я имел ввиду их общее число.
То что в модах давно используется таблица валидных левел_вертексов - я в курсе
Отсутствуют данные по тестовым локациям, незадействованным в игре,
У меня есть данные по всем локациям - даже незадействованным.
Вот например мин и макс. значения левел_вертексов для всех локаций
--------------------------------------------------------------------------------------------------
Повторю свой вопрос:
Если я соберусь переводить оффлайновый ящик в онлайн через
Код:
function SetSwitchOnline(id)
local osBox = alife():object(id)
if osBox then
alife():set_switch_online(id,true)
alife():set_switch_offline(id,false)
end
end
то значит ли что я смогу затем оперировать с данным ящиком и его содержимым как с клиентскими объектами - и применять к ним клиентские методы? Мне просто надо взорвать мину в ящике, который в оффлайне. (типа кто- то порылся и подорвался).
Пока не могу это проверить в игре - так как есть проблемка с нахождением на локации оффлайновых ящиков(почему то проверка не срабатывает - пока ищу причину).
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Я меня такой вопрос:
Тут **50016ea8aab1bb10eeba**or k, v in pairs (table) do[/code]
После распарсирования что означает k и v?
Если вопрос не понятен:
[code]local npc_stalker = level.object_by_id(k)[/code]
Что сдесь k значит?И что бы сдесь значило v?
k -- индекс (ключь)
v -- соответствующее индексу (ключу) значение
отредактировал(а) singapur22: 22-08-2010 17:27 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
erlik
(сорри, видел вопрос, но забыл на него ответить)
Собственно если ты читал диалог по 'set_switch_online', то заметил бы, что я использовал понятие 'отложенный'.
В принципе ничто не мешает это делать одновременно со спавном, но ... я уже как-то привык делать это через именно отложенный на период апдейта алгоритм. Его можно посмотреть в АМК и Симбионе. Суть: любой объект подвергается неким изменениям (переодевает непись иной визуал, спавнится и наполняется тайник, ...) - для отображения изменений именно для гейм-объекта, объект переводится в офф-лайн (по необходимости) и возвращается в он-лайн с уже обновленными данными.
Естественно после этого с ним можно полноценно работать как с гейм-объектом. Само собою, гейм-объекты могут быть только на одной локации с актором.
Есть еще один метод из этой серии 'alife():set_interactive(id, true/false)', но ... нет достаточно точных и достоверных данных о необходимости его использования.
Stalk15 k - key (ключ) v - value (значение)
И чтобы не возвращаться по аналогичному:
for i, v in ipairs (table) do end i - index (индекс) v - value (значение)
Собственно обозвать можно как угодно (k,v/i,v/id,obj/...) - важен смысл операторов- итераторов. А еще более важен - смысл итерации таблицы, т.к. если ты спрашиваешь подобное - для тебя совершенно неясен сам процесс того, что ты этой итерацией по таблице делаешь. :-(
Stalk15
Дополню чуток:
Я так понимаю это - local npc_stalker = level.object_by_id(k) - взято из кода, где делается проход по таблице storage.
Так вот - при итерации этой таблицы - k - в качестве табличного индекса является цифиркой которая обозначает айдишки онлайновых объектов имеющих логику (другие объекты в этой таблице вроде как не присутствуют). Структура storage построена так, чтобы имелся быстрый и простой доступ по ключу к данным нужного объекта. Поэтому айдишки туда и занесены именно как индексы(ключи).
Значение же ключа к - а это та самая букаффка v - таблица. Таким образом storage состоит из субтаблиц, которые можно представить вот так
local db.storage ={}
db.storage[id]={ключ=значение, ключ=значение и т.д.}
db.storage[id]={ключ=значение, ключ=значение и т.д.}
То есть значением каждого айди (которые являются ключами таблицы storage)
является какая-нибудь таблица с данными.
Если хочешь узнать что там хранится - возьми и проитерируй ее .
singapur22
А почему это дело работает только для текущей локации - то есть если правильно понял - там где ГГ?
все - дошло. Artos, singapur22 - благодарю за пояснения. :-)
Любой серверный объект имеет парой клиентский(гейм)-объект только на текущей локаци
вот это я и забыл, когда вопрос писал - потом вспомнил.
отредактировал(а) erlik: 22-08-2010 18:05 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Любой серверный объект имеет парой клиентский(гейм)-объект только на текущей локации, т.е. на которой находится актор. Поэтому любые действия с серверными объектами предназначенные для клиентских будут реализованы только если объект на текущей локации. Собственно все это происходит в биндерах ...
А вот и 'хотя': Собственно параметр 'online' имеется у серверных объектов и ничто не мешает им управлять, однако для объектов НЕ на текущей локации это не имеет смысла. Запись в сэйвы для объектов происходит в биндерах и если объект незабинден - то и изменения не будут запомнены в сэйве.
Если же реализовать свой биндер, то в нем можно будет реализовать возможность изменять состояния объектов и на других локациях. Но это уже 'фантазии' модмейкеров. ;-)
Stalk15 actor, npc, p - параметры на входе функции.
В даном контексте можно утверждать, что 'p' - таблица.
Соотстетственно 'p[1]' - 1-ый элемент таблицы. Очевидно это строковое имя инфопоршня.
Stalk15 В данном случае, аргумент p принимает занчение (при вызове функции) как таблицу. Это сделано для возможности передачи аргументов в функцию из конфигов логики.
Собсно, первые два значения (actor, npc) идут по умолчанию, всё что идёт после них, передаваемые ТОБОЙ аргументы. В конфигах логики вызов подобной функции будет выглядеть так:
%=name(аргумент1 : аргумент2 : аргумент3)%
В данном случае указанные аргументы передадутся как значения таблицы p.
Где:
"аргумент1" будет под индексом 1
"аргумент2" будет под индексом 2
"аргумент3" будет под индексом 3
Разделение аргументов производится ОБЯЗАТЕЛЬНО ТОЛЬКО знаком двоеточие : Так как запятая в конфигах логики означает логическое (ИЛИ)
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Вероятно для Stalk15 и иже ... стОит уточнять:
Вызов данной функции идет НЕ из конфигов логики, а из 'xr_logic.script' (хотя и это тоже упрощение), который распарсивает конфиги логики объекта и преобразует их в требуемые значения/аргументы/...
Соответственно для правильной работы парсинга требуется соблюдение принятых форматов.
win win
Неужели в сотый раз нужно кому-то объяснять, что использование хер-спавнера для корректной работы с объектами, тем более ему 'штатно' неизветыми - удел лентяев!?
Неужели ты думаешь, что ленясь понять и использовать нормальные способы спавна (прямое редактирование all.spawn'а, script-spawn), ты получишь тут разжеванный ответ "как после хер-спавнера исправить в all.spawn'е все нужные параметры"?
Под 'каким образом производишь спавн' singapur22 имел ввиду код (секцию из all.spawn'а или скрипт-функцию), которым ты это делаешь, а не инструмент.
win win
1. Тут все же НЕ ликбез для неграмотных и лентяев. Все что нужно давно есть в ФАК'ах и многочисленных статьях/топиках.
2. Не умеешь - или не берись или НАУЧИСЬ!
3. ACDC - это всего лишь утилита, которая позволяет распаковать/запаковать файл all.spawn'а, без распауовки и запаковки которого тебе в любом случае не обойтись, ежели затеял спавнить не скриптами.
НЕ работать он не может, если для него обеспечить необходимые простейшие требования, расписанные тысячи раз. Используя скомпиллированные версии ACDC, не требующие установки актив-перла, можно всегда (рас)паковать.
5. "Не работает" у тебя всего лишь потому, что ты неправильно указываешь путь/имя файла ...
Artos ну тогда скажи где чё прописовать
у меня раньше был АСДС там просто пихаешь спавн в папку с прогой и он всё распаковывает но пришлось делать фрагматирование дисков и он слетел
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.