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

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


Svoboда

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

@Norman Eisenherz 
Проблема в том, что используемый предмет расходует "энергию" бронекостюма, который надет на гг. Тут уж кондишн не отнимешь. (не в том смысле, что нельзя, а в том, что задумка)

God save Hatsune Miku!

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


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

@AndreySol 
Есть некий предмет ,который:
1. возможно использовать только когда надет костюм
2. при каждом использовании отнимает одну энергию этого костюма

В целом, нужно: записывать переменную при сохранении/читать при загрузке/присвоить ей значение 10 в начале игры

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

God save Hatsune Miku!

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


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

Сохранить, вроде как, получилось. 
При сохранении такой вылет: 

Скрытый текст

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value)

как только не загружал: 
load_variable("energy")
load_variable(energy)
load_variable("energy",nil)
load_variable("energy",0)

 Варианты?

upd: ошибся, данный вылет при загрузке сейва. 
При сохранении всё работает. 

 

Есть, конечно, вариант, что я вызываю функцию не там, хотя не знаю, вызов идёт в самом конце функции function actor_binder:load(reader) в бинде сталкера

 

God save Hatsune Miku!

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


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

@AndreySol 

load_variable это как раз и есть та функция, что мне выше привели

-- Загружаем переменную
function load_variable(variable_name, value_if_not_found)
   return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)
end

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

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

God save Hatsune Miku!

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


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

@Zander_driver Опустим все подробности, на данный момент мне нужно просто:
1. Научится сохранять переменную в Pstor

2. Научится при загрузке сохранения её считывать оттуда

Как минимум, хочу именно в этом разобраться.  

God save Hatsune Miku!

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


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

@Zander_driver вот результаты: 
 

Скрытый текст
В файле en.script обьявляю переменную:
energy = 10
В файле bind_stalker.script: 
Сохраняю: 
В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy)
Загружаю: 
В функции function actor_binder:net_spawn(data) после строчки: db.add_actor(self.object) таким образом: 
	 
local test = 5 
en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test)

что в итоге: 
При начале новой игры в переменной energy присваивается не 10, как указано в файле en.sctipt, а значение локальной переменной test - из кода загрузки. 
В последующие сейвлоады, при каждой загрузке, ей присваивается значение 5, а не то, которое было сохранено.

 

Скрытый текст
В файле en.script обьявляю переменную:
energy = 10
В файле bind_stalker.script: 
Сохраняю: 
В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy)
Загружаю: 
В функции function actor_binder:load(reader) таким образом: 
local test = 5 
en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test)

что в итоге:
При загрузке происходит вылет, с таким вот логом: 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value)

 

 

Помимо прочего: Я выводил в лог значение сохраненной переменной - сохраняет оно правильно. 

God save Hatsune Miku!

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


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


Доброго дня, нашёл такую функцию: 

--/ определяем название секции патронов в активном стволе NPC
function Get_ActiveAmmoSection(oNPC) --/< (npc or nil)
  if not oNPC then oNPC = db.actor end
  local oItem = oNPC and oNPC:active_item()
  if oItem and isWeapon(oItem) then --/ проверка: оружие ли в руках?
    local soWeapon = sim:object(oItem:id())
    if soWeapon then
      local iAmmoType = Get_AmmoType(soWeapon) --/< получаем тип патронов в стволе
      if iAmmoType then
        return Get_AmmoSection(oItem:section(),iAmmoType) --/> "ammo_section" (or nil)
      end
    end
  end
  return nil --/>
end

Но при использовании ругается на sim 
Кто нибудь знает, что это и где его объявить?
В lua helper есть похожая функция, там переменная sim объявлена как:

local sim             = nil --/ переменная, кеширующая функцию alife()

Или, может кто знает другой способ узнать секцию патронов в активном слоте

God save Hatsune Miku!

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


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

Как можно отследить выстрел из оружия? 
Точнее, вопрос даже в том, можно ли?

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

God save Hatsune Miku!

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


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

 

А можно ли "отследить" изменение переменной? 
Вот, к примеру, выполнить код, если переменная X уменьшилась, скажем, на 5. 

upd: 
Есть такой вот скрипт: 

Скрытый текст
local old_ai_id = 0
local check_ammo = false

function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "оружие" then
				check_ammo = true
				on_change_wpn(ai)
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_shoot() end
		end
	end
end



function on_change_wpn( obj )
	ammo_old = obj:get_ammo_in_magazine()
end

function on_actor_shoot()
--тут что делать после выстрела
end

 

Он, в целом, работает - но проблема в том, что работает одноразово. Выстрелил  - сработало. Чтобы сработало ещё раз, нужно снять с себя оружие и повесить его обратно в слот. 

Намекните как править

God save Hatsune Miku!

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


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

upd: 

работать перестает после перезарядки оружия
Перезарядил, нужно вытащить из слота и поставить обратно.  печально. 

upd: нет, дело не в перезарядке, "ломается", когда истратил все патроны, т.е. когда колво-патронов становится равно 0

Или ,всё таки, в перезарядке

upd: 

разобрался

Если вдруг кому-то понадобится в будущем данный костыль, вот: 
*Отследить выстрел из оружия/отследить выстрел при стрельбе*

Скрытый текст

1. Основная функция, вешаем на апдейт: 

local check_ammo = false
local old_ai_id = 0
function gun()
	local ai = db.actor:active_item()
	if ai then
		if ai:id()~=old_ai_id then
			old_ai_id = ai:id()
			if ai:section() == "имя секции оружия" then
				check_ammo = true
				ammo_old = ai:get_ammo_in_magazine()
			end
		end
	else
		if old_ai_id~=0 then old_ai_id=0 check_ammo=false end
	end
	if check_ammo then
		local curr_ammo = ai:get_ammo_in_magazine()
		if curr_ammo < ammo_old then
			ammo_old = curr_ammo
			if not level.main_input_receiver() then on_actor_pay() end
		end
	end
end

2. Функция on_actor_pay():

function on_actor_pay()
-- тут код того, что вы хотите сделать при выстреле
this.start_timer() - запуск таймера
end

3. таймер: 

   function action_timer()
      old_ai_id = 0
   end
 
   function start_timer()
      local iTimer = time_global() + 1000
 
      local function check_timer()
         return time_global() > iTimer
      end
 
      level.add_call(check_timer, action_timer)
   end

Таймер нужен, чтобы присвоить переменной old_ai_id значение 0 через секунду. (этого времени хватает для "перезарядки" оружия) если присвоить переменной old_ai_id значение 0 до того, как оружие перезарядится - функция on_actor_pay() будет срабатывать много раз, пока оружие не перезарядится. Находясь в апдейте - это действительно много раз. 

4. функция preload(), тоже на апдейт:

function preload()
local ai = db.actor:active_item()
	if ai and ai:section() == "имя секции оружия" then
	local curr_ammo_preload = ai:get_ammo_in_magazine()
		if curr_ammo_preload == 0 then
		check_ammo = false
		old_ai_id = 0
		end
	end
end

Нужна для решения бага, который возникал в случае самовольной разрядки оружия, после которого функция "gun" переставала работать. 

 

upd: Да, костыль. Да, корявый. Да, нагружает апдейт.  Но это лучшее решение для тех, кто не хочет/не может качать, к примеру, ОГСР двиг, в котором, как сказал ранее товарищ @Zander_driver, есть для этого каллбек. 

  • Смешно 1

God save Hatsune Miku!

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


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

upd: 2. Функция on_actor_pay(). (та, что выше, рассчитана для оружия, в котором всего один патрон, эта - подойдет для любого) 

function on_actor_pay()
local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine()
=============================================--свой код писать только ниже этой полоски
-- тут код того, что вы хотите сделать при выстреле
=============================================--свой код писать только выше этой полоски
if curr_ammo_yes== 0 then
start_timer()
end
end

 

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

God save Hatsune Miku!

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


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

Возможно в чистом ТЧ получить координаты точки, на которую нацелен/смотрит ГГ?

@Кекс в логику рестриктора функцию:

=set_squad_enemy_to_actor(id_сквада)

 

God save Hatsune Miku!

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


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

Вопрос по ТЧ!
Доброго времени суток, товарищи. Я тут понемногу самостоятельно обучаюсь, решил вот сделать смарт-террейн (гулаг). Делал по аналогии уже имеющихся. 
1. В СДК поставил смарт, прицепил к нему шейп, прописал в логике имя, всё как положено: 

[smart_terrain]

type = pseudo_monolit
capacity = 3
groups = 0, 3
2. Поставил трех нпсов, в их кастом дату прописал принадлежность к этому гулагу: 

[smart_terrains]

pseudo_monolit = true
3. Создал для них три точки walk и три точки look. (их назвал правильно - имя_смарта_имя_точки
3ap6UJ2L537CZmMj_B21DE_5Kc2vDxZ7p_4HDkuW

 

в файле gulag_escape.script прописал для них логику и все, что нужно:
 

Скрытый текст

if type == "pseudo_monolit" then
    
    t = { section = "logic@pseudo_monolit_guard1",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_monolit1"
                    end
    }


    table.insert(sj, t)
    
    t = { section = "logic@pseudo_monolit_guard2",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_monolit2"
                    end
    }
    
    
        table.insert(sj, t)
    
    t = { section = "logic@pseudo_monolit_loner",
        idle = 0,
        prior = 8, state = {0,2},
        position_threshold = 100,
            online = true,
        in_rest = "", out_rest = "",
        predicate = function(obj_info)
                        return obj_info.name == "esc_pseudo_loner"
                        
                    end
    }
    
    table.insert(sj, t)
    
end

 

=========

 

        if type == "pseudo_monolit" then
        return function(gulag)
            return 0
        end
    end

 

=======

        if gulag_type == "pseudo_monolit" then
        return npc_community == "stalker"
    end

 

 

В файле gulag_escape.ltx прописал им их логику. 
 

Скрытый текст

[logic@pseudo_monolit_guard1]
active = walker@pseudo_monolit_guard1

[walker@pseudo_monolit_guard1]
path_walk = guard1_walk
path_look = guard1_look
def_state_standing = guard

[logic@pseudo_monolit_guard2]
active = walker@pseudo_monolit_guard2

[walker@pseudo_monolit_guard2]
path_walk = guard2_walk
path_look = guard2_look
def_state_standing = guard

[logic@pseudo_monolit_loner]
active = walker@pseudo_monolit_loner

[walker@pseudo_monolit_loner]
path_walk = loner_walk
path_look = loner_look
def_state_standing = guard

Так вот, сама проблема в том, что эти нпс - стоят на тех местах, где были заспавнены. Их логика почему-то к ним не "цепляется". Если на них нападут (мутант, или сталкер какой) то как всё успокоится, они встанут на том месте, где остановились. Как "заставить" их "увидеть" их логику и действовать, согласно ней? Спасибо!

God save Hatsune Miku!

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


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

доброго вечера, в общем такая проблема: 
получаю цель: local target = level.get_target_obj() (это XRE, но не суть)

 

получаю имя секции этой цели (в моём случае сталкера): local sect = target:profile_name()

 

далее, я хочу удалить именно этого нпс:

		for a=10,65634,1 do
		local obj=alife():object(a)
		if obj and target and string.find(obj:name(),sect) then
		alife():release(obj,true)
		end
		end

но дело в том, что есть нпс, типа:

south_digger_default1
south_digger_default2
south_digger_default3
south_digger_default4

и при "удалении" одного - у меня удаляются все. (то есть если я удалю одного нпс из деревни новичков, например, то там останется только Волк). Как мне удалить именно того, кого я выбрал? 

God save Hatsune Miku!

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


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

@Manool Хорошо, я вот удалил этого нпс. Допустим, через некоторое время я хочу его вновь заспавнить (именно его (с таким же именем и тд)). Как это сделать? причем так, чтоб он вновь стал "работать" под своей логикой, и присоединился к своему гулагу, если был в нем.
Ещё раз спасибо.

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

God save Hatsune Miku!

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


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

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...