Перейти к содержанию

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

 
 

Last_Dawn именно control-12 отвечает за урон и прочее - смотри оригинальный файл wpn_hand_knife_hud_animation.omf из ЗП или ЧН

 

  • Лайк 1

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


Ссылка на сообщение
Поделиться на другие сайты
 
4 часа назад, nasar75 сказал:

Last_Dawn именно control-12 отвечает за урон и прочее - смотри оригинальный файл wpn_hand_knife_hud_animation.omf из ЗП или ЧН

 

А, вот оно что. А то всё перебрал, а с контролами не понял нифига. Спасибо.

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


Ссылка на сообщение
Поделиться на другие сайты
 
В 28.12.2021 в 01:26, AziatkaVictor сказал:

rts2404 есть модификации на ТЧ, которые переходили на ЗП систему рук. Вроде как и ОГСР тоже, если я ничего не путаю. По логике, тебе надо просто открыть модельку в том же блендере и убрать меш рук, благо это можно сделать в пару кликов. В теме блендера автор аддона, скорее всего, объяснит тебе лучше.

Благодарю за ответ, уже со вчера разбираюсь в блендере, жутко интересно и потенциально можно все меши перепортировать. Однако, сначала изучу вопрос.

 

  • Лайк 1
  • Мастер! 1

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


Ссылка на сообщение
Поделиться на другие сайты
 

Привет всем. Пытаюсь сделать вывод точки на карту в пда, после использования предмета. В pda.script  все нужные точки зарегистрировал, а в bind_stalker.script, в функции actor_binder:use_inventory_item написал это:

local sect = obj:section()

if sect == "ros_map" then
   pda.add_event_or_place_rostok()
end

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

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


Ссылка на сообщение
Поделиться на другие сайты
 

Emmis как выглядит функция pda.add_event_or_place_rostok()? И добавлено ли выполнение этой функции в функцию fill_primary_objects() (или в биндере актора в update рядом с ее вызовом)

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

В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 
8 часов назад, vader_33 сказал:

Emmis как выглядит функция pda.add_event_or_place_rostok()?

Спойлер

local ros_event_or_place_tbl = 
{
	{target="ros_map_ev_or_pl_1",					hint="event_or_place_desc"},
	{target="ros_map_ev_or_pl_2",					hint="event_or_place_desc"},
}	

function add_event_or_place_rostok()	
	for k,v in pairs(ros_event_or_place_tbl) do
		local obj_id = get_story_object_id(v.target)
		if(obj_id) then
			level.map_add_object_spot(obj_id, "event_or_place", v.hint)
		end
	end
end

в апдейт вписывал, но тогда точки появляются сразу со старта игры, а при и использовании предмета они снова появляются и наслаиваются. Те которые появляются после использования предмета исчезают после перезагрузки, а те что в апдейте (со старта игры) остаются

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


Ссылка на сообщение
Поделиться на другие сайты
 

Emmis как вариант, при использовании выдавать инфопоршень, и в add_event_or_place_rostok проверять его наличие. Ну или ставить метку на серверный объект level.map_add_object_spot_ser

  • Мастер! 1

В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 

vader_33 Приветствую. Нашел скрипт в GUI где имеется функция для вывода иконки предметов из таблицы. 

Сама функция

function give_icon_params(sect,n)
	local ini = system_ini()
	local t = {}
	local file
	if ini and ini:section_exist(sect) then
		local tex_name
		if n>=4 and ini:line_exist(sect, "icon") then
			tex_name = ini:r_string(sect, "icon")
		elseif sect_by_icon[sect] then
			tex_name = sect_by_icon[sect]
		end
		if tex_name then
			local tex_info = GetTextureInfo(tex_name, tex_name)
			local rect = tex_info:get_rect()
			t.x = rect.x1
			t.y = rect.y1
			t.width = rect.x2 - rect.x1
			t.height = rect.y2 - rect.y1
			file = tex_info:get_file_name()
		else
			t.width = read_if_exist("f",nil,sect,"inv_grid_width",0)*50		--ini:r_float(sect, "inv_grid_width")*50
			t.height = read_if_exist("f",nil,sect,"inv_grid_height",0)*50	--ini:r_float(sect, "inv_grid_height")*50
			t.x = read_if_exist("f",nil,sect,"inv_grid_x",0)*50				--ini:r_float(sect, "inv_grid_x")*50
			t.y = read_if_exist("f",nil,sect,"inv_grid_y",0)*50				--ini:r_float(sect, "inv_grid_y")*50
			file = "ui\\ui_icon_equipment"
		end
	end
	if not file then
		t.width = 170
		t.height = 58
		t.x = 813
		t.y = 943
		file = "ui\\ui_npc_monster"
	end
	return file, t
end
Спойлер

--[[-----------------------------------------------------------------------------------------------
 File              : ui_cheat_naxac.script
 Description       : Спавн-меню
 Created           : 07.09.2013
 Last edit         : 15.05.2014
 Copyright         : naxac
--]]-----------------------------------------------------------------------------------------------
local cheat_list = {
-- weapons and ammo
    {"*** Оружие ***",
    "wpn_knife",
    "wpn_pm",
    "wpn_pb",
    "wpn_fort",
    "wpn_fort_m1",
    "wpn_hpsa",
    "wpn_beretta",
    "wpn_walther",
    "wpn_walther_m1",
    "wpn_sig220",
    "wpn_colt1911",
    "wpn_colt_m1",
    "wpn_usp",
    "wpn_desert_eagle",
    "wpn_eagle_m1",
    "wpn_bm16",
    "wpn_toz34",
    "hunters_toz",
    "wpn_wincheaster1300",
    "wpn_winchester_m1",
    "wpn_spas12",
    "wpn_spas12_m1",
    "wpn_ak74u",
    "wpn_ak74u_m1",
    "wpn_mp5",
    "wpn_mp5_m1",
    "wpn_mp5_m2",
    "wpn_ak74",
    "wpn_ak74_m1",
    "wpn_abakan",
    "wpn_abakan_m1",
    "wpn_abakan_m2",
    "wpn_l85",
    "wpn_l85_m1",
    "wpn_l85_m2",
    "wpn_lr300",
    "wpn_lr300_m1",
    "wpn_sig550",
    "wpn_sig_m1",
    "wpn_sig_m2",
    "wpn_groza",
    "wpn_groza_m1",
    "wpn_val",
    "wpn_val_m1",
    "wpn_vintorez",
    "wpn_svu",
    "wpn_svd",
    "wpn_svd_m1",
    "wpn_rg-6",
    "wpn_rg6_m1",
    "wpn_rpg7",
    "wpn_g36",
    "wpn_fn2000",
    "wpn_gauss",
    "*** Боеприпасы  ***",
    "ammo_9x18_fmj",
    "ammo_9x18_pmm",
    "ammo_9x19_pbp",
    "ammo_9x19_fmj",
    "ammo_11.43x23_hydro",
    "ammo_11.43x23_fmj",
    "ammo_12x70_buck",
    "ammo_12x76_dart",
    "ammo_12x76_zhekan",
    "ammo_5.45x39_ap",
    "ammo_5.45x39_fmj",
    "ammo_9x39_sp5",
    "ammo_9x39_ap",
    "ammo_9x39_pab9",
    "ammo_5.56x45_ss190",
    "ammo_5.56x45_ap",
    "ammo_7.62x54_7h14",
    "ammo_7.62x54_7h1",
    "ammo_7.62x54_ap",
    "ammo_og-7b",
    "ammo_vog-25p",
    "ammo_vog-25",
    "grenade_f1",
    "grenade_rgd5",
    "grenade_gd-05",
    "ammo_m209",
    "ammo_gauss",
    "*** Навесы  ***",
    "wpn_addon_scope",
    "wpn_addon_scope_susat",
    "wpn_addon_silencer",
    "wpn_addon_grenade_launcher",
    "wpn_addon_grenade_launcher_m203"},
--outfits
    {"*** Броня ***",
    "novice_outfit",
    "outfit_novice_m1",
    "stalker_outfit",
    "outfit_stalker_m1",
    "outfit_stalker_m2",
    "scientific_outfit",
    "exo_outfit",
    "outfit_exo_m1",
    "bandit_outfit",
    "outfit_bandit_m1",
    "killer_outfit",
    "outfit_killer_m1",
    "monolit_outfit",
    "specops_outfit",
    "outfit_specnaz_m1",
    "military_outfit",
    "svoboda_light_outfit",
    "outfit_svoboda_m1",
    "svoboda_heavy_outfit",
    "dolg_outfit",
    "outfit_dolg_m1",
    "dolg_scientific_outfit",
    "ecolog_outfit",
    "protection_outfit"},
--items
    {"*** Артефакты ***",
    "af_medusa",
    "af_cristall_flower",
    "af_night_star",
    "af_vyvert",
    "af_gravi",
    "af_gold_fish",
    "af_blood",
    "af_mincer_meat",
    "af_soul",
    "af_electra_sparkler",
    "af_electra_flash",
    "af_electra_moonlight",
    "af_rusty_thorn",
    "af_rusty_kristall",
    "af_rusty_sea-urchin",
    "af_ameba_slime",
    "af_ameba_slug",
    "af_ameba_mica",
    "af_drops",
    "af_fireball",
    "af_cristall",
    "af_dummy_glassbeads",
    "af_dummy_pellicle",
    "af_dummy_battery",
    "af_dummy_dummy",
    "af_dummy_spring",
    "af_fuzz_kolobok",
    "*** Части монстров ***",
    "mutant_flesh_eye",
    "mutant_boar_leg",
    "mutant_dog_tail",
    "mutant_psevdodog_tail",
    "mutant_krovosos_jaw",
    "mutant_burer_hand",
    "mutant_zombie_hand",
    "*** Девайсы ***",
    "wpn_binoc",
    "device_torch",
    "detector_simple",
    "detector_advances",
    "detector_elite",
    "device_pda",
    "hand_radio",
    "guitar_a",
    "harmonica_a",
    "*** Еда и медикаменты ***",
    "bread",
    "kolbasa",
    "conserva",
    "vodka",
    "energy_drink",
    "bandage",
    "medkit",
    "medkit_scientic",
    "medkit_army",
    "antirad",
    "*** Квестовые  ***",
    "gunslinger_flash",
    "esc_wounded_flash",
    "quest_case_02",
    "dar_document1",
    "dar_document2",
    "dar_document3",
    "dar_document4",
    "dar_document5",
    "kruglov_flash",
    "lab_x16_documents",
    "good_psy_helmet",
    "bad_psy_helmet",
    "decoder"},
--monsters
    {"*** Кровососы ***",
    "bloodsucker_weak",
    "bloodsucker_normal",
    "bloodsucker_strong",
    "*** Кабаны ***",
    "boar_weak",
    "boar_normal",
    "boar_strong",
    "*** Бюреры ***",
    "burer_weak",
    "burer_normal",
    "burer_strong",
    "*** Кошки ***",
    "cat_weak",
    "*** Химеры ***",
    "chimera_weak",
    "chimera_normal",
    "chimera_strong",
    "electro_chimera",
    "*** Контроллёры ***",
    "m_controller_normal",
    "m_controller_normal_fat",
    "m_controller_old",
    "m_controller_old_fat",
    "controller_tubeman",
    "*** Ворона ***",
    "m_crow",
    "*** Слепые псы ***",
    "dog_weak",
    "dog_normal",
    "dog_strong",
    "*** Плоти ***",
    "flesh_weak",
    "flesh_normal",
    "flesh_strong",
    "*** Изломы ***",
    "fracture_weak",
    "fracture_normal",
    "fracture_strong",
    "*** Псевдогиганты ***",
    "gigant_normal",
    "gigant_strong",
    "*** Полтергейсты ***",
    "m_poltergeist_normal_tele",
    "m_poltergeist_tele_outdoor",
    "m_poltergeist_normal_flame",
    "m_poltergeist_strong_flame",
    "*** Псевдособаки ***",
    "pseudodog_weak",
    "pseudodog_normal",
    "pseudodog_strong",
    "psy_dog",
    "*** Снорки ***",
    "snork_weak",
    "snork_normal",
    "snork_strong",
    "aes_snork",
    "snork_indoor",
    "snork_outdoor",
    "snork_jumper",
    "*** Тушканы ***",
    "tushkano_normal",
    "*** Зомби ***",
    "zombie_weak",
    "zombie_normal",
    "zombie_strong",
    "zombie_immortal"},
--stalkers
    {"*** Нейтралы ***",
    "esc_stalker_respawn_1",
    "bar_stalker_respawn_4",
    "bar_stalker_respawn_1",
    "bar_stalker_respawn_2",
    "*** Долг ***",
    "bar_dolg_respawn_1",
    "bar_dolg_respawn_2",
    "bar_dolg_respawn_3",
    "*** Свобода ***",
    "mil_freedom_respawn_2",
    "mil_freedom_respawn_1",
    "pri_respawn_freedom",
    "*** Бандиты ***",
    "gar_bandit_respawn_1",
    "gar_bandit_respawn_2",
    "ds_bandit_respawn_3",
    "cit_bandit_respawn_2",
    "*** Наёмники ***",
    "ros_killer_respawn_3",
    "ros_killer_respawn_2",
    "ros_killer_respawn_4",
    "*** Монолит ***",
    "pri_monolith_respawn_1",
    "pri_monolith_respawn_2",
    "mil_monolit_rush_respawn_1",
    "*** Военные ***",
    "esc_soldier_respawn_1",
    "esc_soldier_respawn_specnaz",
    "pri_respawn_military",
    "*** Зомбированные ***",
    "rad_zombied_respawn_1",
    "rad_zombied_respawn_2",
    "rad_zombied_respawn_3",
    "*** Экологи ***",
    "yan_ecolog_respawn_1"
    }
}
local btnsActorParams = {}
local menu = nil
-------------------------------------------------------------------------------------------------------------------
class "cheat_menu"  (CUIScriptWnd)

function cheat_menu:__init(owner) super()
    menu = self
    if self.menu_index == nil then self.menu_index = 1 end
    local eng = [[qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?!@#$%^&*()-_+=\| 0123456789]]
    local rus = [[йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,!"№;%:?*()-_+=\/ 0123456789]]
    self.translit = {}
    for i = 1, string.len(rus) do
        self.translit[string.sub(eng, i, i)] = string.sub(rus, i, i)
    end
    self.need_lang = false
    self.was_found = -1
    self:InitControls()
    self:InitCallBacks()
    self:FillList()
end

function cheat_menu:__finalize()
end

function cheat_menu:FillList()
    if self.list:GetSize() > 0 then self.list:RemoveAll() end
    self.tbl = cheat_list[self.menu_index]
    for i = 1,#(self.tbl) do
        local item = self.tbl
        self:AddItemToList(item)
    end
end

function cheat_menu:InitControls()
    self:Init(0,0, 1024, 768)
    self.xml = CScriptXmlInit()
    self.xml:ParseFile("ui_naxac_cheat.xml")
    self.xml:InitStatic("back_video", self)
    self.xml:InitStatic("background", self)
    self.xml:InitStatic("rug_video", self)
    
    self.dialog = self.xml:InitStatic("main_dialog:dialog", self)
    self.xml:InitStatic("main_dialog:cap_cheat", self.dialog)
    
    self.xml:InitFrame("frame",    self.dialog)
    
    self.tab = self.xml:InitTab("main_dialog:tab", self.dialog)
    self:Register(self.tab,    "tab")
    
    self.xml:InitFrame("main_dialog:list_frame",            self.dialog)
    
    self.list = self.xml:InitList("main_dialog:list_window",     self.dialog)
    self:Register(self.list, "list_window")
    
    local ctrl
    ctrl = self.xml:Init3tButton("main_dialog:btn_spawn", self.dialog)
    self:Register(ctrl, "btn_spawn")
    ctrl = self.xml:Init3tButton("main_dialog:btn_cancel", self.dialog)
    self:Register(ctrl, "btn_cancel")
    
    -- Описание
    self.xml:InitFrame("frame_descr", self)
    self.cap_descr = CUIStatic()
    self.cap_descr:SetAutoDelete(true)
    self.cap_descr:SetText("Описание:")
    self.cap_descr:SetFont(GetFontGraffiti19Russian())
    self.cap_descr:Init(25,58,70,25)
    self:AttachChild(self.cap_descr)
    self.descr = self.xml:InitStatic("descr_list", self)
    -- Цена
    self.cost = CUIStatic()
    self.cost:SetAutoDelete(true)
    self.cost:SetText("")
    self.cost:SetTextColor(255,235,157,30)
    self.cost:SetFont(GetFontGraffiti19Russian())
    self.cost:Init(65,204,140,20)
    self.dialog:AttachChild(self.cost)
    -- Вес
    self.weight = CUIStatic()
    self.weight:SetAutoDelete(true)
    self.weight:SetText("")
    self.weight:SetTextColor(255,242,159,26)
    self.weight:SetFont(GetFontGraffiti19Russian())
    self.weight:Init(65,226,140,20)
    self.dialog:AttachChild(self.weight)
    
    -- Поиск по имени / ввод количества предметов
    self.edit_box = self.xml:InitEditBox("main_dialog:frame_search",    self.dialog)
    
    self.search = CUIStatic()
    self.search:SetWindowName("search")
    self.search:SetAutoDelete(true)
    self.search:SetText("Поиск / Кол-во")
    self.search:SetTextColor(255,200,255,200)
    self.search:SetFont(GetFontLetterica18Russian())
    self.search:Init(745,295,134,23)
    self:AttachChild(self.search)
    self:AddCallback("search", ui_events.WINDOW_LBUTTON_DB_CLICK, self.RemoveText, self)
    
    self.btn_find = CUIButton()
    self.btn_find:Init("ui\\ui_hud",378,85,45,25)
    self.btn_find:SetText("Найти")
    self.btn_find:SetTextAlign(CGameFont.alCenter)
    self.btn_find:SetTextY(1)
    self.btn_find:SetTextColor(255,240,165,25)
    self.btn_find:SetOriginalRect(65,704,37,25)
    self.btn_find:SetStretchTexture(true)
    self:Register(self.btn_find, "btn_find")
    self.dialog:AttachChild(self.btn_find)
    self:AddCallback("btn_find", ui_events.BUTTON_DOWN, self.SearchItem, self)
    
    self.text = ""
    -- переключение раскладки клавиатуры (EN/RU)
    self.lang = "RUS"
    self.btn_lang = CUIButton()
    self.btn_lang:Init("ui\\ui_hud",594,85,37,25)
    self.btn_lang:SetText(self.lang)
    self.btn_lang:SetTextAlign(CGameFont.alCenter)
    self.btn_lang:SetTextY(1)
    self.btn_lang:SetTextColor(255,240,165,25)
    self.btn_lang:SetOriginalRect(65,704,37,25)
    self:Register(self.btn_lang, "btn_lang")
    self.dialog:AttachChild(self.btn_lang)
    self:AddCallback("btn_lang", ui_events.BUTTON_DOWN, self.ClickBtnLang, self)
    
    self:LoadCaption()
    self:ActorParametres()
end

function cheat_menu:InitCallBacks()
    self:AddCallback("tab",                ui_events.TAB_CHANGED,                self.OnTabChange,            self)
    self:AddCallback("btn_cancel",        ui_events.BUTTON_CLICKED,            self.OnBtnCancel,            self)
    self:AddCallback("btn_spawn",        ui_events.BUTTON_CLICKED,            self.OnBtnSpawn,            self)
    self:AddCallback("list_window",        ui_events.LIST_ITEM_CLICKED,         self.OnListItemClicked,        self)
    self:AddCallback("list_window",        ui_events.WINDOW_LBUTTON_DB_CLICK,    self.OnListItemDbClicked,    self)
end

function cheat_menu:ActorParametres(prop)
    local actor = db.actor
    if actor and actor:alive() then
        if not self.params then
            self.params = self.xml:InitFrame("actor_params_list",    self)
            self.xml:InitStatic("actor_params_capt", self.params)
            self.st_health = self.xml:InitStatic("actor_health", self.params)
            self.st_radiat = self.xml:InitStatic("actor_radiation", self.params)
            self.st_psy = self.xml:InitStatic("actor_psy_health", self.params)
            self.st_power = self.xml:InitStatic("actor_power", self.params)
            
            self.st_health:SetText(string.format("Здоровье: %d",actor.health*100).."%")
            self.st_radiat:SetText(string.format("Радиация: %d",actor.radiation*100).."%")
            self.st_psy:SetText(string.format("Пси-здоровье: %d",actor.psy_health*100).."%")
            self.st_power:SetText(string.format("Выносливость: %d",actor.power*100).."%")
            
            for n=1,8 do
                local name="button_"..n
                local btn = CUIButton()
                btn:SetAutoDelete(false)
                btn:SetWindowName(name)
                self:Register(btn)
                self.params:AttachChild(btn)
                btnsActorParams[name] = btn
                btn:InitTexture("ui\\ui_common")
                local x,y,x1 = 49,1000,15
                if n%2 == 0 then
                    x,y,x1 = 678,209,40
                end
                btn:SetOriginalRect(x,y,21,21)
                local y1 = 29+30*math.floor((n-1)/2)
                btn:Init(x1,y1,21,21)
                btn:Show(true)
                self:AddCallback(name, ui_events.BUTTON_DOWN, loadstring("ui_cheat_naxac.clickParamBtn("..n..")"), self)
            end
        end
    end
end

function cheat_menu:OnBtnCancel()
    self:GetHolder():start_stop_menu    (self.owner, true) --new(show main window)
    self:GetHolder():start_stop_menu    (self,true)
    self.owner:Show                        (true)
end

function cheat_menu:OnTabChange()
    local i = self.tab:GetActiveIndex()
    self.menu_index = i+1
    self:FillList()
    self:LoadCaption()
    
    self.list:ResetFocusCapture()
    local itm_index = self.list:GetFocusedItem()
    if itm_index then self.list:ScrollToPos(itm_index) end
    self:OnListItemClicked()
end

function cheat_menu:LoadCaption()
    local names = {"вооружение","броню","предмет","монстра","сталкера"}
    
    if self.subCapt == nil then
        self.subCapt = CUIStatic()
        self.subCapt:SetAutoDelete(true)
        self.subCapt:SetText("Выберите "..names[self.menu_index]..":")
        self.subCapt:SetTextColor(255,249,230,182)
        self.subCapt:SetFont(GetFontGraffiti19Russian())             
        self.subCapt:Init(65,85,150,21)
        self.dialog:AttachChild(self.subCapt)
    else
        self.subCapt:SetText("Выберите "..names[self.menu_index]..":")
    end
end

function cheat_menu:OnListItemClicked()
    if self.list:GetSize()==0 then return end
    
    local itm_index = self.list:GetSelectedItem()
    if itm_index < 0 or #self.tbl<itm_index+1 then return end
    self.list:SetFocusedItem(itm_index)
    
    self:GetDescription(itm_index)
end

function cheat_menu:OnListItemDbClicked()
    self:OnBtnSpawn()
end

function cheat_menu:GetDescription(index)
    local section = self.tbl[index+1]
    if string.find(section,"***") then return end
    local file, sizes = give_icon_params(section, self.menu_index)
    
    local pw = (sizes.width/5)*4
    local ph = (sizes.height/5)*4
    local px = 348-(pw/2)
    local py = 176-(ph/2)
    
    if self.pict == nil then
        self.pict = CUIStatic()
        self.pict:SetWindowName("pict")
        self.pict:SetAutoDelete(true)
        self.dialog:AttachChild(self.pict)
    end
    self.pict:InitTexture(file)
    self.pict:SetOriginalRect(sizes.x,sizes.y,sizes.width,sizes.height)
    self.pict:Init(px,py,pw,ph)
    self.pict:SetStretchTexture(true)
    
    if self.menu_index >= 4 then
        self.descr:SetText("")
        self.cost:SetText("")
        self.weight:SetText("")
        return
    end
    
    local ini = system_ini()
    local description = "%c[255,255,0,0]<no description>"
    local cst,wght = 0,0
    if ini:section_exist(section) then
        if ini:line_exist(section, "description") then
            description = game.translate_string(ini:r_string(section, "description"))
        end
        if ini:line_exist(section, "cost") then
            cst = ini:r_float(section, "cost")
        end
        if ini:line_exist(section, "inv_weight") then
            wght = ini:r_float(section, "inv_weight")
        end
    end
    
    if string.len(description)>=1050 then description = string.sub(description,1,1047).."..." end
    
    self.descr:SetText(description)
    self.cost:SetText(string.format("Цена: %d руб.", cst))
    self.weight:SetText(string.format("Вес: %.2f кг.", wght))
end

function cheat_menu:ClickBtnLang()
    self.lang = (self.lang == "RUS" and "ENG") or "RUS"
    self.btn_lang:SetText(self.lang)
end

function cheat_menu:RemoveText()
    self.text = ""
    self.search:SetText("_")
    self.was_found = -1
end

function cheat_menu:SearchText(letter)
    local lett = letter and (self.lang=="RUS" and self.translit[letter] or letter) or ""
    if lett == "%" then return end
    if string.len(self.text)>=18 then return end
    if string.len(self.text)>1 then self.text = string.sub(self.text,1,-2)..lett.."_"
    else self.text = lett.."_" end
    
    self.search:SetText(self.text)
end

function cheat_menu:BackSpace()
    if self.text ~= "" and string.len(self.text)>2 then
        self.text = string.sub(self.text,1,-3).."_"
        self.search:SetText(self.text)
    else
        self.text = "_"
    end
    self.was_found = -1
    self.search:SetText(self.text)
end

function cheat_menu:SearchItem()
    if self.text == "" then return end
    local size = self.list:GetSize()
    local search_text = string_lower(string.sub(self.text,1,-2))
    search_text = string.gsub(search_text,"-"," ")
    for i=0,size-1 do
        local item = self.list:GetItem(i)
        local item_text = string_lower(item.fn:GetText())
        item_text = string.gsub(item_text,"-"," ")
        item_text = string.gsub(item_text,"ё","е")
        if #item_text >= #search_text and string.find(item_text,search_text) then
            if self.was_found < i then
                self.was_found = i
                self.list:ScrollToPos(i)
                self.list:SetFocusedItem(i)
                self:GetDescription(i)
                break
            end
        end
    end
end

function cheat_menu:OnBtnSpawn()
    if not check_game() then return end
    
    if self.list:GetSize()==0 then return end
    local itm_index        = self.list:GetFocusedItem()
    if (not itm_index) or itm_index < 0 or itm_index > #self.tbl-1 then return end

    local sect = self.tbl[itm_index+1]
    if string.find(sect,"***") then return end
    if not system_ini():section_exist(sect) then return end
    
    local count = tonumber(string.sub(self.text,1,-2))
    
    self.text = ""
    self.search:SetText("_")
    if self.menu_index < 4 then this.spawn_items(sect,count)
    -- нпс спавним по одному
    else this.spawn_npc(sect) end
end

function cheat_menu:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
    if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
        if dik == DIK_keys.DIK_ESCAPE then self:OnBtnCancel()
        elseif dik == DIK_keys.DIK_RETURN then self:OnBtnSpawn()
        elseif dik == DIK_keys.DIK_TAB then self:OnKeyNewTab()
        elseif dik == DIK_keys.DIK_BACK then self:BackSpace()
        elseif dik == DIK_keys.DIK_DOWN then self:NavigateList("down")
        elseif dik == DIK_keys.DIK_UP then self:NavigateList("up")
        elseif dik == DIK_keys.DIK_LMENU then self.need_lang = true
        elseif dik == DIK_keys.DIK_LSHIFT and self.need_lang then self.need_lang = false self:ClickBtnLang()
        else
            self.need_lang = false
            local letter = string.sub(self.edit_box:GetText(),-1)
            if letter and letter~="" then
                self:SearchText(letter)
                self.edit_box:SetText("")
            end
        end
    end
    return true
end

function cheat_menu:NavigateList(where)
    if not where then return end
    local size = self.list:GetSize()
    local index = self.list:GetFocusedItem()
    local new_index = 0
    if where == "down" then
        if not index or index<0 or index>=size-1 then new_index = 0
        else new_index = index+1 end
    elseif where == "up" then
        if not index or index<=0 or index>size-1 then new_index = size-1
        else new_index = index-1 end
    end
    self.list:SetFocusedItem(new_index)
    self.list:ScrollToPos(new_index)
    self:GetDescription(new_index)
end

function cheat_menu:OnKeyNewTab()
    local i = self.tab:GetActiveIndex()
    local index = i<4 and i+1 or 0
    self.tab:SetNewActiveTab(index)
    self:OnTabChange()
end

function cheat_menu:AddItemToList(sect)
    local ini = system_ini()
    local itm_name,fail,caption
    if string.find(sect,"***") then
        itm_name = sect
        caption = true
    elseif ini:section_exist(sect) then
        if self.menu_index == 5 then
            local comm = this.read_if_exist("s",ini,sect,"community",sect)
            local rank = this.read_if_exist("s",ini,sect,"spec_rank","")
            if rank == "regular" then rank = "experienced" end
            if comm == "stalker" then comm = "neutral" end
            itm_name = game.translate_string(comm.."_"..rank)
        else
            itm_name = game.translate_string(this.read_if_exist("s",ini,sect,"inv_name",sect))
        end
        --    Если вещь квестовая - напишем об этом
        if (ini:line_exist(sect, "quest_item") and ini:r_bool(sect, "quest_item") == true)
                or (ini:line_exist(sect, "can_trade") and ini:r_bool(sect, "can_trade") == false) then
            itm_name = itm_name.." (квестовый)"
        end
    else
        -- Если в таблицу написали какую-то хрень - сообщаем
        itm_name = "Секция ["..sect.."] отсутствует в игре!"
        fail = true
    end
    
    -- Укоротим нах длинные названия, а то некрасиво
    if string.len(itm_name)>50 then itm_name = string.sub(itm_name,1,48).."..." end
    
    local _itm = text_item()
    _itm.fn:SetText(itm_name)
    if fail then
        _itm.fn:SetTextColor(255,200,30,30)
    elseif caption then
        _itm.fn:SetTextColor(255,60,200,60)
    end
    self.list:AddItem(_itm)
end
------------------------------------------------------------------------------------------
local sect_by_icon = {        -- иконки для сталкеров
    ["esc_stalker_respawn_1"]="ui_npc_u_green_stalker_2",
    ["bar_stalker_respawn_4"]="ui_npc_u_stalker_neytral_hood_uzor",
    ["bar_stalker_respawn_1"]="ui_npc_u_stalker_neytral_nauchniy",
    ["bar_stalker_respawn_2"]="ui_npc_u_stalker_neytral_exoskeleton",
    ["bar_dolg_respawn_1"]="ui_npc_u_stalker_do_mask",
    ["bar_dolg_respawn_2"]="ui_npc_u_stalker_do_nauchniy",
    ["bar_dolg_respawn_3"]="ui_npc_u_stalker_do_exoskeleton",
    ["mil_freedom_respawn_2"]="ui_npc_u_stalker_sv_rukzak_1_1",
    ["mil_freedom_respawn_1"]="ui_npc_u_stalker_sv_hood_9",
    ["pri_respawn_freedom"]="ui_npc_u_stalker_sv_exoskeleton",
    ["gar_bandit_respawn_1"]="ui_npc_u_stalker_bandit_3",
    ["gar_bandit_respawn_2"]="ui_npc_u_stalker_bandit_4",
    ["ds_bandit_respawn_3"]="ui_npc_u_stalker_bandit_master",
    ["cit_bandit_respawn_2"]="ui_npc_u_stalker_bandit_master",
    ["ros_killer_respawn_3"]="ui_npc_u_stalker_ki_head_1",
    ["ros_killer_respawn_2"]="ui_npc_u_stalker_ki_mask",
    ["ros_killer_respawn_4"]="ui_npc_u_stalker_ki_exoskeleton",
    ["pri_monolith_respawn_1"]="ui_npc_u_stalker_mo_head_1",
    ["pri_monolith_respawn_2"]="ui_npc_u_stalker_mo_nauchniy",
    ["mil_monolit_rush_respawn_1"]="ui_npc_u_stalker_mo_exo",
    ["esc_soldier_respawn_1"]="ui_npc_u_soldier_bandana",
    ["esc_soldier_respawn_specnaz"]="ui_npc_u_soldier_spetsnaz",
    ["pri_respawn_military"]="ui_npc_u_stalker_militari_antigas_2",
    ["rad_zombied_respawn_1"]="ui_npc_u_stalker_zombie1",
    ["rad_zombied_respawn_2"]="ui_npc_u_stalker_zombie2",
    ["rad_zombied_respawn_3"]="ui_npc_u_zombie_exoskeleton",
    ["yan_ecolog_respawn_1"]="ui_npc_u_stalker_ecolog"
    }
function give_icon_params(sect,n)
    local ini = system_ini()
    local t = {}
    local file
    if ini and ini:section_exist(sect) then
        local tex_name
        if n>=4 and ini:line_exist(sect, "icon") then
            tex_name = ini:r_string(sect, "icon")
        elseif sect_by_icon[sect] then
            tex_name = sect_by_icon[sect]
        end
        if tex_name then
            local tex_info = GetTextureInfo(tex_name, tex_name)
            local rect = tex_info:get_rect()
            t.x = rect.x1
            t.y = rect.y1
            t.width = rect.x2 - rect.x1
            t.height = rect.y2 - rect.y1
            file = tex_info:get_file_name()
        else
            t.width = read_if_exist("f",nil,sect,"inv_grid_width",0)*50        --ini:r_float(sect, "inv_grid_width")*50
            t.height = read_if_exist("f",nil,sect,"inv_grid_height",0)*50    --ini:r_float(sect, "inv_grid_height")*50
            t.x = read_if_exist("f",nil,sect,"inv_grid_x",0)*50                --ini:r_float(sect, "inv_grid_x")*50
            t.y = read_if_exist("f",nil,sect,"inv_grid_y",0)*50                --ini:r_float(sect, "inv_grid_y")*50
            file = "ui\\ui_icon_equipment"
        end
    end
    if not file then
        t.width = 170
        t.height = 58
        t.x = 813
        t.y = 943
        file = "ui\\ui_npc_monster"
    end
    return file, t
end

function spawn_items(sect,num)
    if not sect then return end
    num = num~=nil and (num>10 and 10 or num) or 1    -- больше десяти предметов за раз не спавним
    for i=1,num do
        alife():create(sect,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
    end
    local snd = xr_sound.get_safe_sound_object([[device\decoder]])
    snd:play(db.actor, 0, sound_object.s2d)
end

function spawn_npc(sect)
    if not sect then return end
    local pos = db.actor:position()
    local dir = db.actor:direction()
    pos = pos:add(dir:mul(3))
    alife():create(sect,pos,db.actor:level_vertex_id(),db.actor:game_vertex_id())
    local snd = xr_sound.get_safe_sound_object([[device\decoder]])
    snd:play(db.actor, 0, sound_object.s2d)
end

function check_game()
    return alife() and level.present() and db.actor and db.actor:alive()
end

function string_lower(str)
    local low = [[qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэячсмитьбюё]]
    local high = [[QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ]]
    local low_str = ""
    for i = 1, #str do
        local letter = string.sub(str,i,i)
        for a = 1,#high do
            if letter == string.sub(high,a,a) then letter = string.sub(low,a,a) break end
        end
        low_str = low_str..letter
    end
    return low_str
end

function clickParamBtn(num)
    local actor = db.actor
    if not (actor and actor:alive()) then return end
    
    local step = num%2 == 0 and -0.05 or 0.05
    local stat
    local param = math.floor((num-1)/2)
    if param == 0 and actor.health>0 then
        actor.health = step
        stat = menu.st_health
    elseif param == 1 then
        actor.radiation = step
        stat = menu.st_radiat
    elseif param == 2 and actor.psy_health>0 then
        actor.psy_health = step
        stat = menu.st_psy
    elseif  param == 3 then
        actor.power = step
        stat = menu.st_power
    end
    if stat then
        local st_text = stat:GetText()
        local n = string.find(st_text," ")
        local capt = string.sub(st_text,1,n)
        local str_num = string.sub(st_text,n+1,-2)
        
        local new_num = tonumber(str_num)+(step*100)
        new_num = (new_num>100 and 100) or (new_num<0 and 0) or new_num
        stat:SetText(capt..tostring(new_num).."%")
    end
end

-- получаем информацию из ини-файла
function read_if_exist(what,ini,section,name,def)
    if not ini then ini = system_ini() end
    if ini and ini:section_exist(section) and ini:line_exist(section,name) then
        if what == "f" then
            return ini:r_float(section,name)
        elseif what == "s" then
            return ini:r_string(section,name)
        elseif what == "b" then
            return ini:r_bool(section,name)
        end
    end
    return def
end

------------------------------------------------------------------------------------------
class "text_item" (CUIListItemEx)

function text_item:__init() super()
    self:SetWndRect        (0,0,430,22)
    
    local ca = 255
    local cr = 255
    local cg = 230
    local cb = 200
    
    self.fn                    = CUIStatic    ()
    self.fn:SetAutoDelete    (true)
    self:AttachChild        (self.fn)
    self.fn:SetWndRect        (0,0,230,22)
    self.fn:SetText            ("item")
    self.fn:SetFont            (GetFontLetterica18Russian())
    self.fn:SetTextColor    (ca,cr,cg,cb)
end

Если не сложно помочь нужно разобраться как конкретно его выдрать и адаптировать или примерно без всяких лишних аспектов

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


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms на первый взгляд, надо еще выдрать табличку sect_by_icon и функцию read_if_exist


В беге за рассветом приближаешь свой закат

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


Ссылка на сообщение
Поделиться на другие сайты
 

Народ с наступающим!!!  Если есть спецы по Атмосферу, подскажите, можно ли как то исправить скрипт атмосфера чтоб избавиться от вылета

FATAL ERROR
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : C:\xray\stcop_engine\src\xrServerEntities\script_engine.cpp
[error]Line          : 213
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...\gamedata\scripts\level_weathers.script:461: bad argument #1 to 'find' (string expected, got nil)
 stack trace:

Я понимаю откуда он берётся но не пойму как обойти.
Вылет появляется при загрузке сохранения, если собран отдельный спавн для локи, с общим спавном его нет. Конкретно если я стартую с общим спавном, начинаю новую игру, перехожу на локацию какую то без проблем, сохраняешься - загружаешься, всё отлично.... Но если поставить актора на этой локе и собрать отдельный спавн, то сохраняешься нормально, но загрузиться с сохранения невозможно,  этот вылет, только новая игра... он появляется не на всех локах, 100% на всех подземных, предпологаю, только на тех где не предусмотрены выбросы...

Спойлер

-- Устанавливаем состояние менеджера, распарсивая строку состояния
function WeatherManager:set_state_as_string(ss)
    --self.debugMessages[7]:SetText(ss)
    self.state={}
    local laststring
    for lvlstring in string.gmatch(ss,"[^;]+") do
        laststring=lvlstring
    end
    
строка 461        local i,j,grname,curs,nexs=string.find(laststring,"([^=]+)=([^,]+),([^,]+)")
        if not grname then
            abort("WeatherManager:set_state_as_string: malformed state string. "..ss)
        end
        --local lvl_name=self:unpack_level(lvl)
        local current_state=self:unpack_state(curs)
        local next_state=self:unpack_state(nexs)
        local graph_name=self:unpack_graph_name(grname)
        local graph=self:get_graph_by_name(graph_name)
        self.curr_weather=current_state    
        self.next_weather=current_state
        if graph==nil then
        -- Старая сохранёнка? Будем считать что на этом уровне - статическая погода
        else
            --self.debugMessages[11]:SetText("loaded string="..laststring)
            --self.debugMessages[12]:SetText("self.state["..graph_name.."]={current_state="..current_state..",next_state="..next_state..",graph_name="..graph_name..",graph=}")
            self.state[graph_name]={current_state=current_state,next_state=next_state,graph_name=graph_name,graph=graph}
        end
end

 

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

Группа мода в VK
Мод делался и тестировался на железе
i5-11400, 32Гб ОЗУ, Radeon RX580  Разрешение 2560 х 1440.  ВСЕ на максималке

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


Ссылка на сообщение
Поделиться на другие сайты
 

Можно ли как-то сделать чтобы по скрипту в схеме sr_timer при условии что он активирован в игре наоборот плюсануть время при том что по дефолту данный таймер обратного отсчета

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


Ссылка на сообщение
Поделиться на другие сайты
 

vader_33 

Спойлер

u32 = "u32" -- 0 -> 4294967240
--s8 = "s8" -- так же как и u, но только с таким же отрицательным диапазоном
--s16 = "s16"
s32 = "s32"
float = "flt"
_str = "_str"
bool = "bool"
function READ_IF_EXISTS(r_type,sect,what,default_val,ini) --(тип данных, секция, что читать, значение по умолчанию, файл включения (ini))
    if not ini then
        ini = system_ini()
    end
    if not ini:section_exist(sect) or not ini:line_exist(sect,what) then
        return default_val
    end --есть нужные параметры
    if r_type == u32 then
        return ini:r_u32(sect,what)
--liner: закомментированно из-за того, что в CIniFile (движке) не поддерживаются методы r_u16,r_u8,r_s8,r_s16
--    elseif r_type == u16 then
--        return ini:r_u16(sect,what)
--    elseif r_type == u8 then
--        return ini:r_u8(sect,what)
    elseif r_type == _str then
        return ini:r_string(sect,what)
    elseif r_type == float or r_type == "number" then
        return ini:r_float(sect,what)
    elseif r_type == bool then
        return ini:r_bool(sect,what)
    elseif r_type == s32 then
        return ini:r_s32(sect,what)
--    elseif r_type == s16 then
--        return ini:r_s16(sect,what)
--    elseif r_type == s8 then
--        return ini:r_s8(sect,what)
    else
        return nil
    end
end

 

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


Ссылка на сообщение
Поделиться на другие сайты
 
8 часов назад, Policai сказал:

Если есть спецы по Атмосферу, подскажите, можно ли как то исправить скрипт атмосфера чтоб избавиться от вылета

Юра, привет!

Я не спец, но можно поставить затычку от вылета.

В файле level_weathers.script

Вместо

if self:get_state_as_string() == "" then
        printf("str = empty string")
    end
    F:w_stringZ(self:get_state_as_string())

Пропиши

if self:get_state_as_string() == "" then
        local str_save = "atmosfear_clear_foggy=clear,clear"
        F:w_stringZ( str_save )
    else
        F:w_stringZ(self:get_state_as_string())
    end

Вылет пропадет.  Можешь смело стартовать с подземок.

 

  • Мастер! 1

Терпение... И все получится.

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


Ссылка на сообщение
Поделиться на другие сайты
 

makdm  Привет Дим! А на работу атмосфера в целом это не повлияет? Я же ещё тот скриптер..)))


Группа мода в VK
Мод делался и тестировался на железе
i5-11400, 32Гб ОЗУ, Radeon RX580  Разрешение 2560 х 1440.  ВСЕ на максималке

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


Ссылка на сообщение
Поделиться на другие сайты
 
37 минут назад, Policai сказал:

А на работу атмосфера в целом это не повлияет?

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

Но у тебя же старт на Кордоне!

Поэтому, при старте игры на наземной локации, все будет работать так, как задумано в Атмосфер - моде.

 

  • Мастер! 1

Терпение... И все получится.

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


Ссылка на сообщение
Поделиться на другие сайты
 

Вопрос к знатокам как ставить аддоны на сталкер Misery?
скачал файлы на радио и замену звуков оружия у gunslinger  кинул в корневую папку заменил файлы но ничего... мб есть какой то способ ставить аддоны?

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


Ссылка на сообщение
Поделиться на другие сайты
 

Всех привет. Значит, ввёл в игру новую модель сталкера - в комбезе Заря и в тактической шлеме. 

Несмотря на шлем, его все равно спокойно можно убить одним выстрелом в голову из ПМа... Можно ли это как-то изменить? Вроде бы можно отдельным моделям прописывать повышенный иммунитет к каким-либо видам атак, но только как именно я не знаю. 

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


Ссылка на сообщение
Поделиться на другие сайты
 
25 минут назад, Sidorovich сказал:

Вроде бы можно отдельным моделям прописывать повышенный иммунитет к каким-либо видам атак, но только как именно я не знаю

1. В Actor Editor загружаете модель.

2. Давите кнопку Object

3. В открывшихся свойствах модели в User_Data вписываете путь к файлу защитных свойств модели, например

#include "models\capture\stalker_new.ltx"

4. Теперь по этому пути создаете файл stalker_new.ltx , в котором по аналогии с другими файлами прописываете защитные секции модели.

5. Сами секции защиты головы и корпуса прописываете в файле gamedata\configs\creatures\damages.ltx

piece of cake

  • Мастер! 1

Терпение... И все получится.

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


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, makdm сказал:

1. В Actor Editor загружаете модель.

2. Давите кнопку Object

3. В открывшихся свойствах модели в User_Data вписываете путь к файлу защитных свойств модели, например

#include "models\capture\stalker_new.ltx"

4. Теперь по этому пути создаете файл stalker_new.ltx , в котором по аналогии с другими файлами прописываете защитные секции модели.

5. Сами секции защиты головы и корпуса прописываете в файле gamedata\configs\creatures\damages.ltx

piece of cake

Ох ты ж ё... сколько делать придётся. Хорошо, SDK у меня есть. Но только как мне открыть в нём модель? Он может открывать файлы в формате object, а у меня модель в формате OGF. Модель делал не я, скачал из интернета, исходника в object нет. Что делать? Искать автора или можно как-то конвентировать?
Возможно, глупые вопросы. Но я в это дело ещё ни разу не залезал.

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


Ссылка на сообщение
Поделиться на другие сайты
 
13 минут назад, Sidorovich сказал:

Искать автора или можно как-то конвентировать?

Конвертировать, вот конвертер: abramcumner / xray_re-tools 0.2.1


EaRLNb6.gif
AMD FX-8370 (8 X 4.35GHz); RAM 16Gb; MSI GTX 1070 (8Gb).
Windows -10 PRO (х64)

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


Ссылка на сообщение
Поделиться на другие сайты
 
Спойлер

"X-Ray AI Compiler"
Compilation date: Sep 27 2014

Startup time: 01:40:41
cannot delete file cli58DB.tmp
cannot delete file cli603F.tmp
cannot delete file cli9CCD.tmp
cannot delete file cliA8A6.tmp
cannot delete file und15F9.tmp
cannot delete file und255B.tmp
cannot delete file und349E.tmp
cannot delete file und4057.tmp
cannot delete file und4606.tmp
cannot delete file und519F.tmp
cannot delete file und5834.tmp
cannot delete file und7593.tmp
cannot delete file und86AB.tmp
cannot delete file und9F55.tmp
cannot delete file undB7F6.tmp
cannot delete file undBD8C.tmp
cannot delete file undF2BE.tmp
cannot delete file undF6B7.tmp
cannot delete file undFF53.tmp
! There is no ai-map for the level jupiter! (level is not included into the game graph)
 
* New phase started: Processing level graphs
! There is no ai-map for the level jupiter! (level is not included into the game graph)
 
FATAL ERROR
 
[error]Expression    : assertion failed
[error]Function      : CGraphMerger::CGraphMerger
[error]File          : xr_graph_merge.cpp
[error]Line          : 597
[error]Description   : tpGraphs.size()
 

stack trace:

0023:5C1B7B28 xrCore.dll, xrDebug::fail()
0023:006AE666 xrAI.exe
 

помогите с ошибкой, не могу скомпилировать олл спавн

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


Ссылка на сообщение
Поделиться на другие сайты
 
5 часов назад, torch228 сказал:

помогите с ошибкой, не могу скомпилировать олл спавн

Вот твой вылет: xr_graph_merge.cpp


EaRLNb6.gif
AMD FX-8370 (8 X 4.35GHz); RAM 16Gb; MSI GTX 1070 (8Gb).
Windows -10 PRO (х64)

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


Ссылка на сообщение
Поделиться на другие сайты
 

Решил я значит сделать новую модель НПС через Milkshape. Делал модель в комбезе Заря и в стальном шлеме.
Всё получилось, модель создалась, в игру ввелась. Но всё же есть одна маленькая проблема. На шлем неправильно падает освещение, как-то квадратами (скриншоты прилагаю). С чем это может быть связано, что нужно сделать?

 

Screenshot_6128.png.57860add2352b7234ad8294a3766be9b.pngScreenshot_6129.png.d586beadf0d3d852fab804d3df2886ab.png

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


Ссылка на сообщение
Поделиться на другие сайты
 
8 минут назад, Sidorovich сказал:

На шлем неправильно падает освещение

Это называется сглаживание...

  • Хабар 1

Группа мода в VK
Мод делался и тестировался на железе
i5-11400, 32Гб ОЗУ, Radeon RX580  Разрешение 2560 х 1440.  ВСЕ на максималке

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


Ссылка на сообщение
Поделиться на другие сайты
 
35 минут назад, Policai сказал:

Это называется сглаживание...

Я уже пытался два раза сделать сглаживание, но ничего не получилось. В первый раз всё так и осталось, а во второй модель поломалась...

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

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


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   2 пользователя онлайн