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

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


Svoboда

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

@AndreySol,@Змея,  Можно и записывать. Если еспользуйте X-Ray extensions, то там есть отдельная ф-ция. Логику можно задать в секции НПС или нет-пакетом.

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


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

@Fenrir02, Эти методы применимы к клиентскому объекту фонаря.
 

db.actor:object('device_torch'):switch_torch( true или false) -- включить или выключить фонарик
db.actor:object('device_torch'):is_torch_enabled() --Возвратит true или false в зависимости включен-ли фонарь

 

  • Спасибо 1
  • Полезно 2

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


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

@Romann, Жаркам может свои биндеры сделать?

В секции аномалии нужно смотреть ключ "script_binding"

Или так:

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

local thermal_zones_tbl =
	{
		zone_field_thermal = true,
		zone_field_thermal_weak = true,
		zone_field_thermal_average = true,
		zone_field_thermal_strong = true,
	
		zone_mine_thermal = true,
		zone_mine_thermal_weak = true,
		zone_mine_steam = true,
		zone_mine_steam_weak = true,
		zone_mine_steam_average = true,
	
		zone_zharka_static = true,
		zone_zharka_static_weak = true,
		zone_zharka_static_average = true,
		zone_zharka_static_strong = true
	}

function anomaly_zone_binder:update(delta, obj)
	object_binder.update(self, delta)
	--Система замерзания, чтоб греться у термо аномалий.
		
	if thermal_zones_tbl[self.object:section()] then
		if db.actor:position():distance_to(self.object:position()) <= 4 then
    		if not has_alife_info("EugeniumFreezingSystemWarm") then
    			db.actor:give_info_portion("EugeniumFreezingSystemWarm")
			end
	end
	--Система замерзания, чтоб греться у термо аномалий.
  ...
  ...
  ...
  end

 

Но я бы отдельный биндер сделал...

Изменено пользователем Graff46
  • Спасибо 1

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


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

Что делает эта ф-ция?

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

function mob_capture(mob, reset_actions)
    if reset_actions == nil then
        abort("mob_capture: reset_actions parameter's value is not specified")
    end

    if reset_actions then
        reset_action(mob, script_name())
    else
        if not mob:get_script() then
            mob:script(true, script_name())
        end
    end
end

 

И что делают эти классы\методы?

reset_action(mob, script_name())

mob:script(true, script_name())

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


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

@Fenrir02, Как предметы указывать будите? (ид, имя секции, .... ?)

 

@stalkergoshawk, Если x-ray extensions есть в движке, то у серверного объекта есть свойство angle, к нему нужно приравнять вектор, который укажет направление.

alife():create("stalker", vector():set(0,0,0,), 0, 0).angle = vector():set(0, 1.5, 0)

Если x-ray extensions нет, то нэт-пакетами.

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


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

@stalkergoshawk, 

function set_dir(id, dir) -- установка дирекции (поворота) объекта через нэт-пакет (нужны правки скриптов с типами объектов)
local sobj = alife2:object(id) 
	if sobj then 
		local pk = get_netpk(sobj, 0) 
		if pk:isOk() then 
			return pk:setCallback( { direction = dir } )
		end
	end
	return false
end

Нужно подключить модуль m_netpk.script

 

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


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

@Fenrir02, 

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

function release_random_item(num)
	local Tabl = {["section"] = true, ["section2"] = true} -- таблица необрабатываемых предметов по их секциям
	
	local actor = db.actor
	local cnt = actor:object_count()
	if cnt < num then return end
	for i=1, num do
		local item = actor:object(math.random(0, cnt-1))
		local sobj = alife():object(item:id()) 
		if sobj and not Tabl[sobj:section_name()] then
			alife():release(sobj,true)
			cnt = actor:object_count()
		end
	end
end

 

Изменено пользователем Graff46
  • Спасибо 1
  • Полезно 1

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


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

@AndreySol, Принимает серверный объект, вот строка из луа_хелп:

function release(alife_simulator*, cse_abstract*, boolean);

 

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


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

@Zagolski, Остались. Обратная совместимость нужна когда пишите модули для общего пользования. Если table.geth  нет (не определена Луа новее 5.2 вроде), то её можно написать самому.

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


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

Возможно ли чтение\запись нэт-пакетов актора?

 

Такое не работает

local act = alife():object(0)
local pk = m_netpk.get(act)

Но так работает:

local packet = net_packet()
act:STATE_Write(packet)

Может кто "карту смещений" нэт-пакета для актора предоставить?

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


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

Вот что удалось наработать:

1. В m_netpk.script есть разбор ГГ на нэт-пакет, но при попытке передать ГГ скрипту - вылет.

2. Я используя наработки m_netpk.script написал ф-цию для чтения пакета ГГ.

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

function actnet()
	local c = {	-- Взято из m_netpk.script
	
			{ name = 'game_vertex_id',  type = 'u16', default = -1        },
			{ name = 'distance',        type = 'f32', default =  0.0      },
			{ name = 'direct_control',  type = 'u32', default =  1        },
			{ name = 'level_vertex_id', type = 'u32', default = -1        },
			{ name = 'object_flags',    type = 'h32', default =  0        },
			--{ name = 'custom_data',   type = 'sz',  default = ''        }, --/#-# if only 'string'
			{ name = 'custom_data',     type = 'sz',  default = "" }, --/#!# used helpers
			{ name = 'story_id',        type = 's32', default = -1        },
			{ name = 'spawn_story_id',  type = 's32', default = -1        },
			
			{ name = 'money',              type = 'u32', default = 0           },
			{ name = 'specific_character', type = 'sz',  default = ''          },
			{ name = 'trader_flags',       type = 'h32', default = 1           },
			{ name = 'character_profile',  type = 'sz',  default = ''          },
			{ name = 'community_index',    type = 'h32', default = -1          },
			{ name = 'rank',               type = 'h32', default = -2147483647 },
			{ name = 'reputation',         type = 'h32', default = -2147483647 },
			{ name = 'character_name',     type = 'sz',  default = ''          },
			--{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP
			--{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 }  --/ SCoP
			
			{ name = 'skeleton_name',  type = 'sz',  default = '$editor', hook = 'idle' },
			{ name = 'skeleton_flags', type = 'u8',  default = 0  },
			{ name = 'source_id',      type = 'h16', default = -1 },
    
    		{ name = 'bones_mask',     type = 'u8v8',  default = {0,0,0,0,0,0,0,0} }, -- на этом вылет
			{ name = 'root_bone',      type = 'u16',   default = 0                 },
			{ name = 'bbox_min',       type = 'f32v3', default = vector()          },
			{ name = 'bbox_max',       type = 'f32v3', default = vector()          },
			{ name = 'bones_count',    type = 'u16',   default = 0                 }, --/#~# changed name ('bone_count')
	
			{ name = 'ph_position',    type = 'q8v3',  default = {0,0,0},  },
			{ name = 'ph_rotation',    type = 'q8v4',  default = {0,0,0,0} },
			{ name = 'enabled',        type = 'b8',    default = true      }
	

		}
	
	local act = alife():object(0)
	
	local packet = net_packet()
	act:STATE_Write(packet)
	local str = ""
	for _, v in ipairs(c) do
		str = str.."\n"..  v.name..":".. tostring(m_netpk['_r_'..v.type](packet) ) 
	end
	nt.logfile(str) -- Запись в файл
end

 

3. Есть ошибки в работе: Вылет при попытке чтения методом :r_vec3(vector()), ошибки в парсинге. Возможно 1-я ошибка возникает из 2-ой.

Я читал пакет до того места где надо читать векторы и вот что получил:

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


game_vertex_id:3283 -- Верно
distance:64.400001525879 -- Наверное Верно
direct_control:1 -- Наверное Верно
level_vertex_id:79894 -- Верно
object_flags:-65 -- Наверное Верно

********************* custom_data***************
custom_data:[dont_spawn_character_supplies]

[spawn]
;wpn_binoc
detector_simple
device_torch
vodka
vodka

story_id:-1
spawn_story_id:-1

*******************************************************
money:1869898593 -- Не верно! У ГГ было 40р.!
specific_character:rs\hero\stalker_novice -- Побито! должно быть : "actors\hero\stalker_novice"
trader_flags:0 -- Наверное Верно
character_profile: -- Нет ничего
community_index:4161536 -- Не вено (нет столько группировок)
rank:0 -- Вроде не верно
reputation:-16777216 -- Вроде не верно
character_name:я -- Верно
skeleton_name: -- ?
skeleton_flags:0 -- ?
source_id:0 -- ?

 

 

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

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


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

@Kirgudu, Я делал из примера m_netpk.script . Вот сейчас переделал:

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


function actnet()
	local c = {
			{ name = 'game_vertex_id',  type = 'u16', default = -1        },
			{ name = 'distance',        type = 'f32', default =  0.0      },
			{ name = 'direct_control',  type = 'u32', default =  1        },
			{ name = 'level_vertex_id', type = 'u32', default = -1        },
			{ name = 'object_flags',    type = 'h32', default =  0        },
			--{ name = 'custom_data',   type = 'sz',  default = ''        }, --/#-# if only 'string'
			{ name = 'custom_data',     type = 'sz',  default = "" }, --/#!# used helpers
			{ name = 'story_id',        type = 's32', default = -1        },
			{ name = 'spawn_story_id',  type = 's32', default = -1        },
			
			--{ name = 'money',              type = 's8', default = 0           },
			--{ name = 'specific_character', type = 'sz',  default = ''          },
			--{ name = 'trader_flags',       type = 'h32', default = 1           },
			{ name = 'visual_name',  type = 'sz', default = '' },
			{ name = 'visual_flags', type = 'u8', default = 0  },
			
			{ name = 'g_team',                   type = 'u8',      default = -1  },
			{ name = 'g_squad',                  type = 'u8',      default = -1  },
			{ name = 'g_group',                  type = 'u8',      default = -1  },
			{ name = 'health',                   type = 'f32',     default = 1.0 },
			{ name = 'dynamic_out_restrictions', type = 'l32u16v', default = {}  },
			{ name = 'dynamic_in_restrictions',  type = 'l32u16v', default = {}  },
			{ name = 'killer_id',                type = 'h16',     default = -1  },
			{ name = 'game_death_time',          type = 'u8v8',    default = {0,0,0,0,0,0,0,0} },
			
			{ name = 'character_profile',  type = 'sz',  default = ''          },
			{ name = 'community_index',    type = 'h32', default = -1          },
			{ name = 'rank',               type = 'h32', default = -2147483647 },
			{ name = 'reputation',         type = 'h32', default = -2147483647 },
			{ name = 'character_name',     type = 'sz',  default = ''          },
			--{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP
			--{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 }  --/ SCoP
			
			{ name = 'skeleton_name',  type = 'sz',  default = '$editor', hook = 'idle' },
			{ name = 'skeleton_flags', type = 'u8',  default = 0  },
			{ name = 'source_id',      type = 'h16', default = -1 },
			
			{ name = 'bones_mask',     type = 'u8v8',  default = {0,0,0,0,0,0,0,0} },
			{ name = 'root_bone',      type = 'u16',   default = 0                 },
			--[[ { name = 'bbox_min',       type = 'f32v3', default = vector()          },
			{ name = 'bbox_max',       type = 'f32v3', default = vector()          },
			{ name = 'bones_count',    type = 'u16',   default = 0                 }, --/#~# changed name ('bone_count')
	
			{ name = 'ph_position',    type = 'q8v3',  default = {0,0,0},  },
			{ name = 'ph_rotation',    type = 'q8v4',  default = {0,0,0,0} },
			{ name = 'enabled',        type = 'b8',    default = true      }
			]]
		}
	
	local act = alife():object(0)
	
	local packet = net_packet()
	act:STATE_Write(packet)
	local str = ""
	for _, v in ipairs(c) do
		str = str.."\n"..  v.name..": ".. tostring(m_netpk['_r_'..v.type](packet) ) 
	end
	nt.logfile(str)
end

 

Как дохожу до векторов - вылет.

Вот результат смещений :

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


game_vertex_id: 3283
distance: 64.400001525879
direct_control: 1
level_vertex_id: 79894
object_flags: -65
custom_data: [dont_spawn_character_supplies]

[spawn]
;wpn_binoc
detector_simple
device_torch
vodka
vodka
story_id: -1
spawn_story_id: -1
visual_name: actors\hero\stalker_novice
visual_flags: 0
g_team: 0
g_squad: 0
g_group: 0
health: 1
dynamic_out_restrictions: table: 0FE10940
dynamic_in_restrictions: table: 14A0F5F8
killer_id: 65535
game_death_time: table: 14A05EA8 -- возможно тут пошло не так
character_profile: (  -- пошло точно всё ни так , и дальше тоже
community_index: 1667301376
rank: 7499636
reputation: 0
character_name: actor -- а тут норм. и предыдущий возможно тоже
skeleton_name:
skeleton_flags: 0
source_id: 0
bones_mask: table: 437421A0
root_bone: 64450

 

Может подскажите чего по смещениям?

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

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


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

@Kirgudu, Посидел я повнимательнее и собрал смещения :

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


function actnet()
local c = {

	{ name = 'game_vertex_id',  type = 'u16', default = -1        },
	{ name = 'distance',        type = 'f32', default =  0.0      },
	{ name = 'direct_control',  type = 'u32', default =  1        },
	{ name = 'level_vertex_id', type = 'u32', default = -1        },
	{ name = 'object_flags',    type = 'h32', default =  0        },
	--{ name = 'custom_data',   type = 'sz',  default = ''        }, --/#-# if only 'string'
	{ name = 'custom_data',     type = 'sz',  default = "" 			}, --/#!# used helpers
	{ name = 'story_id',        type = 's32', default = -1        },
	{ name = 'spawn_story_id',  type = 's32', default = -1        },
		
	{ name = 'visual_name',  type = 'sz', default = '' },
	{ name = 'visual_flags', type = 'u8', default = 0  },
	
	{ name = 'g_team',                   type = 'u8',      default = -1  },
	{ name = 'g_squad',                  type = 'u8',      default = -1  },
	{ name = 'g_group',                  type = 'u8',      default = -1  },
	{ name = 'health',                   type = 'f32',     default = 1.0 },
	{ name = 'dynamic_out_restrictions', type = 'l32u16v', default = {}  },
	{ name = 'dynamic_in_restrictions',  type = 'l32u16v', default = {}  },
	{ name = 'killer_id',                type = 'h16',     default = -1  },
	{ name = 'game_death_time',          type = 'u8v8',    default = {0,0,0,0,0,0,0,0} },	

	{ name = 'money',              type = 'u32', default = 0           },
	{ name = 'specific_character', type = 'sz',  default = ''          },
	{ name = 'trader_flags',       type = 'h32', default = 1           },
	{ name = 'character_profile',  type = 'sz',  default = ''          },
	{ name = 'community_index',    type = 'h32', default = -1          },
	{ name = 'rank',               type = 'h32', default = -2147483647 },
	{ name = 'reputation',         type = 'h32', default = -2147483647 },
	{ name = 'character_name',     type = 'sz',  default = ''          },
	--{ name = 'cse_alife_trader_abstract__unk2', type = 'u8', default = 0, ver = 4 }, --/ SCoP
	--{ name = 'cse_alife_trader_abstract__unk3', type = 'u8', default = 0, ver = 4 },  --/ SCoP
	
	{ name = 'skeleton_name',  type = 'sz',  default = '$editor', hook = 'idle' },
	{ name = 'skeleton_flags', type = 'u8',  default = 0  },
	{ name = 'source_id',      type = 'h16', default = -1 },
		
	{ name = 'bones_mask',     type = 'u8v8',  default = {0,0,0,0,0,0,0,0} },
	{ name = 'root_bone',      type = 'u16',   default = 0                 },
	--[[	{ name = 'bbox_min',       type = 'f32v3', default = vector()          },
	{ name = 'bbox_max',       type = 'f32v3', default = vector()          },
	{ name = 'bones_count',    type = 'u16',   default = 0                 }, --/#~# changed name ('bone_count')

	{ name = 'ph_position',    type = 'q8v3',  default = {0,0,0},  },
	{ name = 'ph_rotation',    type = 'q8v4',  default = {0,0,0,0} },
	{ name = 'enabled',        type = 'b8',    default = true      }, --/#~# changed type 'u8'

	{ name = 'holder_id',             type = 'h16', default = -1 },

	{ name = 'actor_state',           type = 'h16' },
	{ name = 'actor_accel_header',    type = 'h16' },
	{ name = 'actor_accel_data',      type = 'h32' },
	{ name = 'actor_velocity_header', type = 'h16' },
	{ name = 'actor_velocity_data',   type = 'h32' },
	{ name = 'actor_radiation',       type = 'f32' },
	{ name = 'actor_weapon',          type = 'u8'  },
	{ name = 'num_items',             type = 'u16' } --/#?#
	]]
	}
	
	local act = alife():object(0)
	
	local packet = net_packet()
	act:STATE_Write(packet)
	local str = ""
	for _, v in ipairs(c) do
		str = str.."\n"..  v.name..": ".. tostring(m_netpk['_r_'..v.type](packet) ) 
	end
	nt.logfile(str)
end

 

Всё работает, но до первого вектора!

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


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

@Graff46, Всё работает! Просто конструкция tostring([ type: userdata]) не допустима в Луа, пришлось добавить условие:

local str = ""
	local dd = ""
	for _, v in ipairs(c) do
		dd = m_netpk['_r_'..v.type](packet)
		if type(dd) == "userdata" then dd = "userdata" end -- Вот условие
		str = str.."\n"..  v.name..": ".. tostring(dd) 
	end
	nt.logfile(str)

 

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


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

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