Перейти к контенту

Скриптование


Svoboда

Рекомендуемые сообщения

(изменено)

ClearSky, а как делать принадлежность вертолёта к группировке? как спавнить вертолёт (скриптом и через ACDC)?

 

Kirag, а сила аномалии разве не в zone_.ltx прописывается?и (параметр max_power_start)

Изменено пользователем ColR_iT

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Влад, раскапывать ACDC'ом all.spawn умеешь? Да? Тогда в конце файла типа "alife_l07_[локация]" прописываешь:

[[номер объекта. ВАЖНО: одинаковых номеров на одной локации быть не должно]]

; cse_abstract properties
section_name = stalker_zombied
name = yan_zombie_20
position =  [i][координаты. например: 217.8,-54.4,32.0][/i]
direction = 0,0,0

; cse_alife_trader_abstract properties
money = 5000
character_profile = [секция одного из профилей одного из файлов character_desc_[локация].xml]

; cse_alife_object properties
game_vertex_id = [i][gvi][/i]
distance = 79.0999984741211
level_vertex_id = [i][lvi][/i]
object_flags = 0xffffffbf
custom_data = <<END
[можно прописать доп. параметры]
END

; cse_visual properties
visual_name = actors\stalker_zombied\stalker_zombied_4

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 0
g_group = 0
health = 1
dynamic_out_restrictions = 
dynamic_in_restrictions = 

upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = -4.18019390106201,-0.0927719995379448,-130.002517700195
upd:o_model = 0
upd:o_torso = 0,0,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0

; cse_alife_monster_abstract properties

upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0

; cse_alife_human_abstract properties
predicate5 = 2,2,2,0,0
predicate4 = 0,1,2,0

; cse_ph_skeleton properties

upd:start_dialog = 

; se_stalker properties

 

Добавлено через 12 мин.:

Kirag, рассмотрим конфиг аномалии:

[zone_field_psychic]:zone_base
GroupControlSection    = spawn_group_zone
$spawn             = "zones\base\field_psychic"
$def_sphere = 15
;$prefetch         = 16
class            = Z_RADIO
hit_impulse_scale    = .01
effective_radius    = 1.00;размер радиуса в процентах от оригинального, где действует зона
sound            =;zone_mosquito_bald
postprocess        = postprocess_psychic
dof_enabled = true

ef_anomaly_type            = 3
ef_weapon_type            = 15

artefacts        =
BirthProbability = 0

;----------- Anomaly settings -----------------------
max_start_power        = 0
attenuation            = 0.5
period                = 1


idle_particles        =;zones\zone_electra_idle
;blowout_particles    =

;hit_small_particles            = damage_fx\burn_creatures
;hit_big_particles            = damage_fx\burn_creatures00
;idle_small_particles        = damage_fx\burn_creatures
;idle_big_particles            = damage_fx\burn_creatures00

idle_particles_dont_stop    = true;

;idle_sound            = ambient\fire2;iinoiyiiue caoe
;blowout_sound        = anomaly\zhar_blow;ai a?aiy aua?ina(oaa?a) a oaio?a aiiiaeee
;hit_sound            = ambient\zhar;ia ia?niia?a, eiaaa oio iieo?aao oeo
;entrance_sound        = ambient\zhar;i?e iiiaaaiee iauaeoa a aiiiaee?


hit_type        = telepatic

disable_time        = -1;время игнорирования неживого объекта в зоне (-1 если не нужно)
disable_time_small    = -1;время игнорирования маленького неживого объекта в зоне (-1 если не нужно)
disable_idle_time    = -1;время отключения idle партиклов

ignore_nonalive        = true;
ignore_small        = false;
ignore_artefacts    = true

blowout_light        = off
idle_light            = off

awaking_time        = 100
blowout_time        = 100
accamulate_time        = 500

visible_by_detector = on

blowout_wind        = off

shape_transp_color        = 200, 200, 0, 60
shape_edge_color        = 32, 32, 32, 255

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;рождение артефактов во время срабатывания
spawn_blowout_artefacts = off

[zone_field_psychic_weak]:zone_field_psychic
$spawn             = "zones\field_psychic_weak"

awaking_time        = 100
blowout_time        = 100
accamulate_time        = 100

;----------- Anomaly settings -----------------------
max_start_power        = 0.064



[zone_field_psychic_average]:zone_field_psychic
$spawn             = "zones\field_psychic_average"
awaking_time        = 100
blowout_time        = 100
accamulate_time        = 100

;----------- Anomaly settings -----------------------
max_start_power        = 0.115



[zone_field_psychic_strong]:zone_field_psychic
$spawn             = "zones\field_psychic_strong"

awaking_time        = 100
blowout_time        = 100
accamulate_time        = 100

;----------- Anomaly settings -----------------------
max_start_power        = 0.166

 

теперь рассмотрите, чем отличаются секции _weak, _average, _strong

 

теперь возьмите любой другой конфиг. проверьте, что max_start_power в любой аномалии возрастает по лестнице: _weak, _average, _strong

 

теперь откроем acdc: в параметрах любой аномалии есть такая вот штука:

max_power = 0

которая наталкивает на мысль, что ранее сила аномалии указывалась в all.spawn, однако потом это изменили. изменять значение на какое-либо другое не пробовал, т.к. пока не до этого.

 

зы: заодно рассмотрим вот это:

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 1.5

есть ещё другие типы шейпов. я видел. но как каждый из них описывать? например, как значит это:

shapes = shape0
shape0:type = box
shape0:axis_x = 1,0,0
shape0:axis_y = 0,1,0
shape0:axis_z = 0,0,1
shape0:offset = 0,0,0

и что за параметр: offset.

------------------------------

АГА!!! всё понял. offset позволяет смещать шейп. т.о. можно сделать следующее: входишь в арку церкви на болотах. а там тебе как жарка ******, причём зажгутся сразу все аномалии, расставленные по периметру забора. :)

 

зы1: а как сделать пси-излучение, подобное янтарскому, на другой локации. например, на складах. я понимаю, что можно сделать слабую-слабую zone_field_psychic_very_weak с огромным радиусом. но ведь на янтаре не так. :)

Изменено пользователем ColR_iT

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Kostya V, короче так:

Допустим, что на карте есть две аномалии: одна аномалия с координатами: 215.7,0.4,-45.4, другая - с координтами: 212.7,0.4,-45.4.

Мы знаем, что аномалия срабатывает тогда, когда актор попадает в шейп (англ. shape - фигура). Например,

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 1.5

указывает шейп, представленный сферой в центре аномалии в радиусом 1.5. При попадании в эту сферу аномалия активируется. Если мы хотим, чтобы центр сферы был не в центре аномалии, а, например, чуть правее по оси x, то используем offset:

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = -4,0,0
shape0:radius = 1.5

Итак, нам необходимо, чтобы при попадании в аномалию №1 активировалась и аномалия №2. Центр первой аномалии оставляем без изменений, а второй смещаем на 3 единице вправо по оси x.

 

Добавлено через 7 мин.:

Влад, так вроде технология одна и та же. Странно.

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вопрос по скриптам:

Есть Функция:

    local b
    local obj[20]
    local num
    local pos = vector ()
    local i
    local community1
    local community2
    community1 = "sim_default_duty_"..math.random (0,4)
    community2 = "sim_default_freedom_"..math.random (0,4)
    b = 7 + math.random (-3,3)
    for i=1, b do
        pos = db.actor:position()
        pos.x = pos.x + 18 + math.random (-4,4)
        pos.y = pos.y + 2
        pos.z = pos.z + math.random(-8,8)
        obj[i] = alife():create(community1,pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
    end
num = b
    b = 7 + math.random (-3,3)
    for i=1, b do
        pos = db.actor:position()
        pos.x = pos.x - 18 - math.random (-4,4)
        pos.y = pos.y + 2
        pos.z = pos.z + math.random(-8,8)
        obj [num + i] = alife():create(community2,pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
    end
num = num + b

 

Как видим, здесь спавниться отряд чуваков из разных группировок. Созданные объекты запоминаются в obj[]. Их кол-во - в переменную num. Как сделать так, чтобы после 90 секунд вызывалась определённая функция, убивающая всех этих неписей.

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Отшель[НИК]

function SpawnAfterHead(long,prob,section)
    if math.random (1,100) < prob then
        local ArLong = {
            [0] = 2.5,
            [1] = 3.5,
            [2] = 4.5,
            [3] = 9
        }
        obj = db.actor
        local dir = vector()
        local pos = vector()
        pos = obj:position()
        dir = obj:direction()
        pos.x = pos.x - dir.x * ArLong[long]
        pos.z = pos.z - dir.z * ArLong[long]
        alife():create(section,pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
    end
end

 

prob - вероятность спавна в процентах

long - как далеко от спины актора будет спавниться непись (0 - близко, 3 - далеко, 1 и 2 - средне)

section - секция непися, который спаунится

Изменено пользователем IQDDD
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

меченый(стрелок), а вот такой к вам вопрос: как всем хорошо известно, lua - язык, в котором функция является обычной переменной и может быть передана в аргументы другой функции. Тогда почему же в амк не используется универсальный таймер (т.е. такой таймер, в котором вызыванные функции могут быть произвольными), вызов которого будет с параметрами функций, например:

new_timer (1, myscript.myfunc, 20)

 

Добавлено:

Vano_Santuri,

на acdc_cs.pl или какой там у тебя, нажимаешь правой кнопкой -> изменить, или открыть с помощью, блокнота.

Маньяк... D:

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

меченый(стрелок), давайте разберёся в аргументах моей функции: new_timer (1, myscript.myfunc, 20)

Здесь первый - это номер таймера.

Второй - имя функции. Кстати, почему это его сохранить нельзя?

Третий - через сколько секунд/миллисекунд/обновлений вызывать процедуру таймера.

 

Задача состоит в том, что создать псевдообъект таймера. Можно при вызове new_timer(...):

Создать объект класса "timer" (его тоже надо создать заранее. Он будет представлять собой класс всего из четёрых свойств: number, procedure, active, interval) Свойства соответственно будут равны: number = 1. procedure = myscript.myfunc. active = true. interval = 20. Запоминаем объект этого класс в глобальную таблицу timerZ. С каждый апдейтом актора будет вызываться функция, проверяющая всю таблицу на наличие объектов класса таймер и, если надо, исполняющая функции, сохранённые в свойстве procedure объектов.

 

Добавлено через 3 мин.:

Tonny, всё это можно (кроме 2. И то можно, только приблизительно и ОЧЕНЬ сложно. Без математики нельзя). Вот только вы изучили, что такое:

1. bind_object

2. callback

3. класс

4. методы update, net_destroy, __init(...) super(...) и пр. класса "bind_object"

?

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
меченый(стрелок), ругайте, не понял. :) и ещё мне не знаком оператор break. Переводится, как "пауза". Но чё делает?

Поделиться этим сообщением


Ссылка на сообщение

Почему в ЧН возникают глюки с экспансией на другие локации. (В частности, на базы). На некоторые смарты идут, преимущественно на крайние, а на некоторые не хотят, и не только на базы. Чем может быть вызвано?

 

Например: сталкеры захватили весь кордон (даже военный блокпост), переходные точки перехода Кордон-Свалка ("блокпост-приемник" и "стоянка за концлагерем"), а дальше идти не хотят. В частности на сам концлагерь ("кладбище техники")

Поделиться этим сообщением


Ссылка на сообщение

1. А я думал, что это максимальное количество силы. Если текущая сила меньше, то спавним ещё. Если больше, то не спавним.

2. Это я для теста прописал. (Это всё-таки спавн-смарт для военных. Но она на одном уровне со сталкерскими спавн-смартами, и захватывают её сталкеры благополучно.

3. Есть. А куда она денется. Я наоборот поставил base_squad_number больше. Сейчас попробую убавить.

4. Нету там такого.

Поделиться этим сообщением


Ссылка на сообщение

Увы, я оказался прав. base_squad_number это максимальное количество силы группировки.

Поделиться этим сообщением


Ссылка на сообщение

Насчёт коллбека на юзание нычки смотри treasure_manager.script. ищи функцию, которая содержит в себе удаление метки нычки на карте.

Поделиться этим сообщением


Ссылка на сообщение

а чтобы сохранить данные при загрузке игры, используй нет пакет.

Поделиться этим сообщением


Ссылка на сообщение

Где у меня ошибка со скриптовым постэффектом? Метод process не вызывается почему-то.

Вот вызов:

local ppe=recovery_effect(max_restored_health-db.actor.health)
ppe:start()

-- Постэффект
class "recovery_effect" (effector)
function recovery_effect:__init(add_health) super()
    self.params = effector_params()
    self.params.blur=0
    self.params.gray=0
    self.params.dual=duality(0,0)
    self.params.noise=noise(0,0,0)
    self.params.color_add=color(0,0,0)
    self.params.color_base=color(0,0,0)
    self.params.color_gray=color(0,0,0)
    
    self.max_add=add_health                                    -- Максимальная яркость
    self.time_start=time_global()                            -- Время начала
    self.time_in=self.time_start+add_health*1.5*1000        -- Время максимального осветления
    self.time_white_scr=self.time_in+add_health*2.5*1000    -- Время начала сброса осветления
    self.time_out=self.time_white_scr+add_health*0.75*1000    -- Время конца
    
    self.time_start_in=self.time_in-self.time_start
    self.time_white_scr_out=self.time_out-self.time_white_scr
    self.pi2=math.pi/2
end

function recovery_effect:process(pp)
    local time=time_global()
    msg("!")
    if time<self.time_in then
        local color_add_cur=self.max_add*math.cos(self.pi2*(self.time_in-time)/self.time_start_in)
        self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur)
    elseif time<self.time_white_scr then
        self.params.color_base=colol(self.max_add,self.max_add,self.max_add)
    elseif time<self.time_out then
        local color_add_cur=self.max_add*math.sin(self.pi2*(self.time_out-time)/(self.time_white_scr_out))
        self.params.color_base=color(color_add_cur,color_add_cur,color_add_cur)
    end
    effector.process(self,pp)
    pp:assign(self.params)
    return true
end

function recovery_effect:finished()
    return self.time_out<time_global()
end

 

Поделиться этим сообщением


Ссылка на сообщение

А если время действия постэффекта заранее неизвестно?

Поделиться этим сообщением


Ссылка на сообщение

1. Радиация - это свойство, поэтому через точку.

2. Операцию сравнения на равенство идет через два знака ==.

3. Свойство объектов класса game_object записываются иначе: записывается значение изменения свойства.

И читайте справочник и справку по Lua. Если не осилить, то не трогайте скрипты.

Поделиться этим сообщением


Ссылка на сообщение
TRAMP14, возможно, что по luabind вы не нашли информацию, но почитали бы справочник, там всё есть. Обращение к свойствам идёт через точку без скобок. К методам, через двоеточие и скобки (если нужно вызвать функцию) и без скобок, если нужно использовать функцию как переменную. А то, что вы знаете pascall, роли не играет: тут вообще-то Lua.

Поделиться этим сообщением


Ссылка на сообщение

return без явного объявления возвращает nil, что в условий эквивалентно логической лжи.

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Рассмотрим содержимое net_packet'а, к-ое содержит информацию о cse_alife_item_weapon (в Зове Припяти):

use constant flAddonSilencer    => 0x01;
use constant flAddonLauncher    => 0x02;
use constant flAddonScope    => 0x04;
use constant properties_info => (
    { name => 'ammo_current',    type => 'u16',    default => 0 },    # 0x194    (0x1b4)
    { name => 'ammo_elapsed',    type => 'u16',    default => 0 },    # 0x196 (0x1b6)
    { name => 'weapon_state',    type => 'u8',    default => 0 },    # 0x191 (0x1b1)
    { name => 'addon_flags',    type => 'u8',    default => 0 },    # 0x1a8 (0x1cc)
    { name => 'ammo_type',        type => 'u8',    default => 0 },    # 0x192 (0x1b2)
    { name => 'cse_alife_item_weapon__unk1_u8',    type => 'u8',    default => 0 },    # cs(0x1a0)

 

Если мы хотим получить информацию о том, какие плюшки повешены на оружие, то надо добраться до значения addon_flags и смотреть биты этого значения. (Кстати, здесь перепутано. Экспериментально установлено, что flAddonScope = 0x01, flAddonSilencer=0x04). С flAddonLauncher и flAddonSilencer всё понятно: существует только одна секция, предметы которой можно повесить в качестве подствола или глушителя. Однако, существует несколько секций оптических прицелов, которые можно повесить на оружие. Например строка из w_lr300.ltx

scopes_sect                   = scope_susat_lr, scope_susat_x1.6_lr, scope_susat_custom_lr, scope_susat_dusk_lr, scope_susat_night_lr

 

Как определить, какой именно прицел повешен на оружие?

 

Заранее спасибо! :)

 

1. Используй спойлер для текстов кодов

2. Даблпостинго вопросов - нарушение правил форума. --/Artos

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Artos, насчёт флагов может я и напутал, хотя врят ли. Завтра ещё раз проверю.

Насчёт оптики вы не правы: спавнил в инвенатре все указанные выше секции, и любая подходила.

 

UPD: и с флагами у меня тоже всё правильно. Ставлю прицел на пушку: флаг становится 1. Добавляю глушитель - 5.

Изменено пользователем IQDDD

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   2 пользователя

AMK-Team.ru

×
×
  • Создать...