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

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

Да, в 5.1 не хватает этого метода.

Впрочем можно написать функцию типа :

function table.len(t)
	local n = 0
	for _ in ipairs(t) do
		n = n + 1
	end
	return n
end

А заодно не хватает __pairs и __ipairs. Да и goto, при аккуратном использовании, помогает крепко сокращать код  :)

Изменено пользователем Nazgool
Ссылка на комментарий

@Nazgool, скорее continue. Без него некоторые циклы вырастают во вложенности очень сильно.

PS: goto

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

 

 

Как тебе такое?

Когда программист что-то пишет, возможны три результата.

0: Все работает относительно идеально

1: Все более-менее работает. Далеко не идеал но сойдет, причина - программисту лень/наплевать на юзеров/мало заплатили/еще что нибудь вставить что понравится.

2: Все более-менее работает. Далеко не идеал но сойдет, причина - программист недостаточно опытен и умел, чтобы сделать лучше.

 

В описанном случае - явный случай из 1 или 2. Какой именно - понятия не имею.

Еще возможен (и на самом деле повсеместно и на каждом шагу происходит) такой случай. Программист написал творение, соответствующее варианту 0. Затем прошло время, требования к продуктам такого рода возросли. И тот же самый продукт уже соответствует случаю 2.

Просто в те годы не было настолько опытных программистов чтобы сделать вот так

Что тогда может делать программист? Он же написал творение по сценарию 0. оно идеально. Было... теперь уже не очень...

Он может уже 2 варианта.

0: повышать свою квалификацию и вновь вытаскивать свой код на уровень идеала

1: ему лень заморачиваться / мало платят / появились другие интересы и он говорит юзерам "и так сойдет, терпите"

 

В выше приведенном случае - финальный вариант 1.

  • Нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Всем привет, у меня такая проблема: зарегистрировал на GUI кнопки, сделал, чтобы они появлялись в зависимости от класса выбранного предмета из списка, но работает  только кнопка использования 

В методе InitControls()

self.btn_use:Show(false)
self.btn_slot_1:Show(false)
self.btn_slot_2:Show(false)
self.btn_drop:Show(true)
В функции клика по итему в списке
local index, item, obj
if self.list:GetSize() == 0 then
return
end
index = self.list:GetSelectedItem()
if index == -1 or index == nil then
return
end
item = self.list:GetItem(index)
if item == nil then
return
end
obj = item:GetSection()

if obj ~= nil then
play_sound_actor([[interface\inv_select]],db.actor, 0, 1.0)
for i = 1, #tEatableClasses do
if get_clsid(obj) == tEatableClasses then
self.btn_use:Show(true)
end
end
for s = 1, #tPistolClasses do
if get_clsid(obj) == tPistolClasses then
self.btn_slot_1:Show(true)
end
end
for a = 1, #tRifleClasses do
if get_clsid(obj) == tRifleClasses[a] then
self.btn_slot_2:Show(true)
end
end
end
Таблицы с классами 

local tPistolClasses = {
clsid.wpn_hpsa,
clsid.wpn_pm,
clsid.wpn_fort,
clsid.wpn_usp45,
clsid.wpn_walther
}
 
local tRifleClasses = {
clsid.wpn_ak74,
clsid.wpn_lr300,
clsid.wpn_shotgun,
clsid.wpn_svd,
clsid.wpn_svu,
clsid.wpn_rpg7,
clsid.wpn_val,
clsid.wpn_vintorez,
clsid.wpn_groza
}
 
local tEatableClasses = {
clsid.obj_medkit,
clsid.obj_bottle,
clsid.obj_bandage,
clsid.obj_antirad,
clsid.obj_food
}

 


В чем же мой косяк?

Изменено пользователем Sla-Sla
Ссылка на комментарий

@Sla-Sla, заполняй таблицы так:

local tPistolClasses = {
[clsid.wpn_hpsa] = true,
[clsid.wpn_pm] = true,
[clsid.wpn_fort] = true,
[clsid.wpn_usp45] = true,
[clsid.wpn_walther] = true
}

а видимость устанавливай так:

 self.btn_slot_1:Show( tPistolClasses[obj:clsid()]~=nil )
  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

Конечно неправильно. Посмотри в lua_help или class_registrator.script как они зарегистрированы.

cs_register	(object_factory, "CWeaponHPSA",		"se_item.se_weapon_magazined",		"WP_HPSA",	"wpn_hpsa_s")

Поэтому нужно писать clsid.wpn_hpsa_s и т.д.

Ссылка на комментарий

Уважаемые, есть ли аналоги для m_netpk (может свои разработки), пригодные для использования?

p.s. - на вопрос - чем тебе m_netpk не подходит - у него неправильно парситься пакет для оружия с подствольником. хочу увидеть альтернативу.

Буду благодарен за Ваши варианты.

Ссылка на комментарий

Такой вопрос - как одной функцией убрать всех НПЦ с уровня?

Можно и через for 1, 64567 или как то так... Забыл просто, как делать проверку вида IsStalker(obj)

Не соответствует правилам.

Ссылка на комментарий

 

 

Забыл просто, как делать проверку вида IsStalker(obj)

Так и делать. У тебя уже в вопросе есть все что требуется для ответа, так и в чем тогда вопрос.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
Так и делать.

Что-то типа этого?

function bla_bla_bla()
  for id=1,65534 do
    local obj = level.object_by_id(id)
    if obj and get_clsid(obj) == IAmAStalker then
       bla_bla.bla()
    end
  end
end

Мне нужно изменить код из этого примера , а то и правда можно хитовать и ящики с БТРами. Вот я попытался переписать ещё и так, чтоб проверялись объекты не на всей локации а только в онлайне:

 

 

	  
--local radius_sqr = 100 -- квадрат радиуса
--local actor_position = db.actor:position() -- позиция актора
-- по идее, лучший вариант сделать биндеры на все живие объекты
-- и регистрировать их в определённую таблицу, которую будем 
-- перебирать и проверять, живой ли объект. Но обойдёмся этим:
-- перебор объектов в онлайне (медленно!)
  local PositionActor = db.actor:position()
for id,o in pairs(db.storage)  do  -- апд: был 0, могло стукнуть актора 
    -- берём с локации
	local obj = level.object_by_id(id)
	-- если объект по ид есть, то
    if obj and get_clsid(obj) == IAmAStalker and obj.alive and obj:alive() then
	    -- если макс хп у объекта не равно -1, значит объект живой
	    if obj:max_health() > 0 then
		    -- если квадрат дистанции, между позицией актора и объектом меньше либо равен макс радиусу в квадрате, то ( distance_to_sqr быстрей вроде как)
		    if obj:position():distance_to(PositionActor) <= 50 then
			    -- Наносим хит (ну тут можно брать и какие то определённые параметры)
			    hit = hit() -- создание объекта класса hit
			   hit.direction = vector():set(1,0,0) --дирекция по оси x
			   hit.draftsman = db.actor --нанёс урон актор
			   hit.impulse = 600 --импульс
			   hit.power = 1.45 --хит
			   hit.type = 2 --тип урона - выстрел
			   hit:bone("bip01_head") -- удар приходится на голову
			   -- наносим урон
			   obj:hit(hit)
			end
		end	
	end
end  

 

 

Я не скриптер, если что-то не так поправьте пожалуйста.

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

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

Ссылка на комментарий

@Romann, попробовал так сделать. Вписал IsStalker(obj), всё проверил, поставил метки через send_tip().

После этого --> if obj and get_clsid(obj) уже ничего не происходило... Пробовал разные варианты, нашел еще пример... В общем не заладилось. Вызывал это дело из меню.

 

Другой вопрос - как проверить находиться ли ГГ в диалоге с НПЦ скриптом?

Почитал справочники - из полезного только level.present() нашел, но это совсем не то(.

Не соответствует правилам.

Ссылка на комментарий

 

 

как проверить находиться ли ГГ в диалоге с НПЦ

А разве не подходит?

if db.actor:is_talking() then ... end

Или тебе надо проверить даилог с конкретным НПС?

  • Спасибо 1

Ранее был известен под ником BoBaH_671.

Ссылка на комментарий

Что это значит? Критично ли для сохранений?

 

! Invalid object 'single_player' position. Outside of sector structure.

Не соответствует правилам.

Ссылка на комментарий

Почему при спавне НПЦ скриптом в его имени к основному добавляются какие-то рандомные цифры?

Если через all.spawn - такого не наблюдаеться...

Не соответствует правилам.

Ссылка на комментарий

По тому что так задумано. Разработчиками.

И не какие-то, а id.

  • Спасибо 1
  • Согласен 1
Ссылка на комментарий

@Dennis_Chikin, просто это доставляло некоторые неудобства...

С id тоже разобрался + оценил новые возможности использования расширенных библиотек Lua.

 

Но вопрос из поста #7569 покоя не дает до сих пор...

Не соответствует правилам.

Ссылка на комментарий

 

 

как проверить находиться ли ГГ в диалоге с НПЦ скриптом?

в XE есть функция для получения собеседника level.get_second_talker(). Но всё равно перед её использованием надо проверять, что идёт разговор.

  • Спасибо 1
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

Ссылка на комментарий

@Malandrinus, спасибо! С этой функцией я разобрался.

Но я, видимо, перепутал номер поста. Хотелось побольше узнать вот об этом.

 

 

 

! Invalid object 'single_player' position. Outside of sector structure.

 

Как я понял, игра ссылается на ГГ, и какую-то структуру сектора... Ну в общем в этой области для меня - туман.

Меня этот вопрос потому так волнует, что сейчас пытаюсь устранить один очень неприятный вылет, в логах даже при модифицированной printf() ничего не видно. И обращаю внимание на любые мелочи...

Не соответствует правилам.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

AMK-Team.ru

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