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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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


Svoboда

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

Зарегистрировал по туторы юз предмета:

function actor_binder:use_obj(obj)


if obj:section()=="repair_kit_weapon" then
alife():create("repair_kit_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
ineeded_condition = obj:condition()
hm_repair.action_repair(ineeded_condition)
end
end

 

создал скрипт:

function action_repair(rcond)

local repair_kit = db.actor:object("repair_kit_weapon")


if repair_kit and (db.actor:active_slot()==1 or db.actor:active_slot()==2) and db.actor:item_in_slot(db.actor:active_slot()) then
repair_kit:set_condition(rcond)
local item = db.actor:item_in_slot(db.actor:active_slot())
local need_for_repair = (1-item:condition())*(1/25)

if item then
if repair_kit:condition()>=need_for_repair then
item:set_condition(1)
repair_kit:set_condition(repair_kit:condition()-need_for_repair)

snd_obj = xr_sound.get_safe_sound_object([[hardcore_mod\repair\repair_weapon]])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
end
end
end

 

Вылет. Пишет что не знает что condition() обращается к nil! Это что не успевает дойти до игры что у меня ремкомплект реснулся или как? И как решить?

  • Не нравится 1

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


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

Да сама проверка кондишна. Вот я переделал скрипт немного вроде

function action_repair(newcondition)


local repair_kit = alife():create("repair_kit_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id()) --,db.actor:id())
--local repair_kit = db.actor:object("repair_kit_weapon")
--repair_kit:set_condition(newcondition)

if (db.actor:active_slot()==1 or db.actor:active_slot()==2) and db.actor:item_in_slot(db.actor:active_slot()) then
local item = db.actor:item_in_slot(db.actor:active_slot())
local need_for_repair = (1-item:condition())*(1/2)

if item then
if repair_kit:condition()>=need_for_repair then
item:set_condition(1)
repair_kit:set_condition(repair_kit:condition()-need_for_repair)

snd_obj = xr_sound.get_safe_sound_object([[hardcore_mod\repair\repair_weapon]])
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
end
end
end
db.actor:transfer_item(repair_kit,db.actor)
end

 

по разному пробовал, в итоге трансфер не работает, походу не знает что такое repair_kit...не успевает обработать? Как быть!

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

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


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

Тогда как? Так тоже не канает:

alife():create("repair_kit_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id())

local repair_kit = db.actor:object("repair_kit_weapon")

 

Видимо из за того что


клиентский даже еще в онлайн перейти не успел.


Как быть то?) 

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


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

Блин ничего не понял :P , я в скриптах просто не очень шарю пока. Завтра попробую разобраться если смогу.

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


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

А чё за global_time_ms?

Expression : fatal error

Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...e.r. - hardcore\gamedata\scripts\bind_stalker.script:204: attempt to perform arithmetic on global 'global_time_ms' (a nil value)

 

Таймер вроде как работает т.к. при изменении global_time_ms на time_global() не вылетает, но тайм глобал в минутах или как? Я написал 20 и в итоге ждать пришлось, так и не дождался. А что такое global_time_ms игра получается не знает.

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

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


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

У меня почемуто через тайм_глобал не работает) Я сделал так:

local need_to_repair_weapon = nil

local repairconditionfornew = 0
local repairprocess = 0

 

function actor_binder:use_obj(obj)
if obj:section()=="repair_kit_weapon" then
repairconditionfornew = obj:condition()
alife():create("repair_kit_weapon",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
need_to_repair_weapon = 20
repairprocess = 1
end
end

 

if repairprocess==1 then
need_to_repair_weapon = need_to_repair_weapon-1
if need_to_repair_weapon<1 then
hm_repair.action_repair(repairconditionfornew)
need_to_repair_weapon = 0
repairprocess = 0
end
end

 



Вот блин а после загрузки сохранения ремкомплект опять целый, видимо потому что не предусмотрено ему изменение состояния...как быть?

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

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


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

Блин решил попробовать сделать ремкомплект оружием которое нельзя поместить в слот и который используется на K, но как его использовать на К? Видел в солянке ДМХ были как в зп так называемые ГОРЯЧИЕ КЛАВИШИ на юз аптеки консервы антирада и бинта вроде на F1-F4, вот мне также надо только с ремкомплектом. Почитал про назначение скриптам горячих кнопок там походу только через меню работать будет, да и не понятно даже что надо писать что не надо. Написал в актор_биндер.апдейт:

if DIK_keys.DIK_K==1 then
	if db.actor:object("repair_kit_weapon") then
		hm_repair.action_repair()
	end
end

в итоге когда я достаю оружие у меня треск потому что сразу автоматом срабатывает ремкомплект как будто я нажимаю постоянно К. Может объясните что как писать прально )

  • Не нравится 1

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


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

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

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


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

Вот у меня тут вопросик опять по ремкомплекту возник: как отрисовать на худе что-либо? Мне нужно отрисовать на худе иконку ремкомплекта и его состояние(если он имеется в наличии). Возомжно ли это? Просто он у меня будет спрятан в слоте 4 и посмотреть состояние можно будет только в ящике т.к по непонятной причине если самому запихнуть предмет из инвентаря в слот 4 то игра вылетает без лога, что не даёт просто возвращать его в рюкзак на юзе. Из за этого и пришлось ему юз на K прикручивать.

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


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

Поставить лог на actor_binder:info_callback(), и посмотреть, что реально когда выдается.

Это ты мне? Если да то я думаю что тут дело просто в том что тот слот не видно и видимо там ячеек нету поэтому такая фигня, и всё же: можно ли отрисовать на худе иконку и состояние предмета под ней?

 

Это было про PDA и инфо.

Про слоты вспоминать надо. Что-то такое было, но, думаю, кто-нибудь раньше ответит. dc

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


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

С ремкомплектом разобрался: гранаты ведь я тоже передвинул в слот песта чтобы трудней было  :P , а ремкомплект поставил на слот гранат и при его доставании сделал weapon_hide и всё работает. Оружие в слоте 3 видно в инвентаре и его нельзя швырять по слотам то что надо, но вот ещё проблемка маленькая: разумеется не обойтись без сообщений чтобы яснее было, но вот только я получаю сообщение не такое

news_manager.send_tip(db.actor, "%c[255,255,255,128]Невозможно отремонтировать оружие. Ремкомплект в плохом состоянии!", nil, nil, 3000)

 

а вот этот кошмар

http://pixs.ru/showimage/ssuser0527_2904593_12293821.jpg

 

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


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

А как прально транслейт прописать? Я вот вписал в string_table_tips то что надо и 

news_manager.send_tip(db.actor, "%c[255,255,255,128]"..game.translate_string("rk_text_weapon_in_slot").." %c[255,255,25,25]"..tostring(db.actor:active_slot()).."%c[255,255,255,128] "..game.translate_string("rk_text_repaired"), nil, nil, 3000)


 

но не прокатило



Хех а кодировка работает не вылетает как при некоторых.

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

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


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

Значит взялся я ремкомплекты "отсебятские" делать для ТЧ. Логика такая:

   +Юзаем комплект - в инвентарь спавнится открытый ремкомплект.

   +Юзаем открытый ремкомплект - открывается окно с вариантами "Починить" и "Закрыть".

 

Всё бы ничего, но почему-то после использования закрытого ремкомплекта колбэк use_object ломается. Подскажет кто в чём проблема?
 

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



--FUNCTION TO CHECK USED ITEM
function mod_func_check_used_item(obj)
	mod_dbg("something used")
	
    if(obj~=nil) then 
		local t_s_sect = obj:section()
		
		mod_dbg("cond now "..l_n_repairkit_cond)
		
		if(l_n_repairkit_cond==-1) then
			if(string.sub(t_s_sect,1,9)=="repairkit") then
				mod_func_respawn_kit(obj,true)
			elseif(string.sub(t_s_sect,1,16)=="opened_repairkit") then
				mod_func_respawn_kit(obj,true)
				
				local t_u_rep_act = ui_repairkit.mod_repair_action_ui(get_hud())
				level.start_stop_menu(t_u_rep_act, true)
			end
		end
    end
end









--REPAIR FUNCTION
function mod_func_repair_item(i_kit,n_slot)
	local t_i_repair = db.actor:item_in_slot(n_slot)
	
	local t_s_kittype = i_kit:section()
	
	local t_n_repairkit_cond = i_kit:condition()
	
	
	
	if(t_i_repair~=nil) then
		local t_s_sound = [[interface\inv_ruck]]   --предмет сильно сломан
		--[[interface\inv_belt]]     --звук пополнения
		
		local t_n_cond = t_i_repair:condition()
		local t_n_repaircond = 1-t_n_cond
		local t_n_newcond = 1
		
		if(t_n_cond>0.26) then
			if(n_slot==6) then
				t_s_sound = [[interface\inv_belt]]   --броня починена
			else
				t_s_sound = [[interface\inv_attach_addon]]   --предмет починен
			end
			
			if(t_n_repairkit_cond<t_n_repaircond) then
				t_n_newcond = t_n_cond+t_n_repairkit_cond
				t_n_repairkit_cond = 0
			else
				t_n_repairkit_cond = t_n_repairkit_cond-t_n_repaircond
			end
			
			t_i_repair:set_condition(t_n_newcond)
		end
		
		local snd_obj = xr_sound.get_safe_sound_object(t_s_sound)
		snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0)
	end
end









--SET NEW REPAIRKIT CONDITION
function mod_set_newkit_condition(n_id)
	local t_i_newkit = level.object_by_id(n_id)
	
	if(t_i_newkit~=nil) then
		t_i_newkit:set_condition(l_n_repairkit_cond)
	else
		l_i_mod_repairkit = nil
	end
	
	l_n_repairkit_cond = -1
end



function mod_func_respawn_kit(obj,open)
	l_n_repairkit_cond = obj:condition()
	
	local t_s_sect = obj:section()
	
	if(open==true) then
		t_s_sect = "opened_"..t_s_sect
	end
				
	l_i_mod_repairkit = alife():create(t_s_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
	level.client_spawn_manager():add(l_i_mod_repairkit, -1, mod_set_newkit_condition)
end


 

 

Простите я забыл в спойлер код запихнуть, но сайт мне не позволяет отредактировать :D

Ах да забыл! Вот это написано ещё в самом начале (чтобы не было лишних вопросов):

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

function mod_dbg(fmt,...)
	local con = get_console()
	con:execute(string.gsub(string.format(fmt,...), " ", "_"))
	con:execute("flush")
end

l_i_mod_repairkit = nil
l_n_repairkit_cond = -1

 

 

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


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

Методом тыка выяснил, что проблему вызывает колбэк на вход в онлайн комплекта:

level.client_spawn_manager():add(l_i_mod_repairkit, -1, mod_set_newkit_condition)

Видимо я не правильно записал сам колбэк? Не понимаю что не так.

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

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


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

@Kirgudu, не помогло. Один фиг дебаговые сообщения о юзе предмета перестают появляться после использования комплекта.

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


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

@AndreySol, не помогло. Я закомментил весь колбэк, но ничего не поменялось. Спасает только закомменчивание самой строчки "заведения" колбэка, но мне без него никак, так как при попытке сделать set_condition происходит краш:

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

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...l.k.e.r\gamedata\scripts\secretsmod_functions.script:123: attempt to call method 'set_condition' (a nil value)

 

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

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


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

@AndreySol, всмысле? Если ты имеешь в виду "а можно ли НЕ на оружии применить set_condition", то я отвечу: да, можно. Только что поменял запуск функции спавна открытого комплекта на простой obj:set_condition(0.5). Это сработало.

Если имелось в виду "можно ли получить condition НЕ оружия и перенести на другое НЕ оружие", то я уверен, что да (но это не точно). Но я попробовал написать так:

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

l_i_mod_repairkit = alife():create(t_s_sect, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
l_i_mod_repairkit:set_condition(0.5)

 

Результат можешь почитать в моём предыдущем посте.

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


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

Сильно пахнет маразмом. Появилась кое-какая мысль и я решил попробовать в конец колбэка на выход в онлайн дописать level.client_spawn_manager():remove(n_id,-1)

Получил довольно экзотический вылет:

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

stack trace:

0023:03C9D16A xrGame.dll
 
[error][     183]    : Невозможно создать файл, так как он уже существует.

 

Ещё эксперементировал с вторым ИД (который -1 сейчас). Пробовал и 0 и db.actor:id() (вроде что 0 что актор ид одинаковые насколько я знаю, но я так на всякий).

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

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


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

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