Пользователей: 0
Гостей: 324
Всего: 324

» Подробно
» Сегодня


Привет, Гость!

Ник


Пароль


Запомнить?




» Добавить в избранное

» Сделать стартовой

Главная
Форум
Обзор игры
Мир Зоны
Файлы
Галерея
Разное






Форумы > Архив > Склад > Вопросы и ответы (ТЧ по 11.09.10)

Страница 20 из 69Первая«17181920212223 »Последняя
Быстрый переход:


 

Автор Сообщение
g-side
[1] Странник
Онлайн статус=0  Профиль    




Посты: 25
Откуда:
Занятие:
Возраст:

09-08-2010 12:58 GMT3 часа #1312824   Split
убрал ,вот что выдаёт

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: ....r. - shadow of chernobyl\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

добавлено спустя 8 минут

игра была с модом (старый сюжет + vss+ + сон с матрацем + ремонт оружия + мои доьовления

Сообщение было успешно отредактировано g-side (09-08-2010 12:58 GMT3 часа, назад)

Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
09-08-2010 13:10 GMT3 часа #1312836   Split
Я тут юзал мобильныйл телепортатор singapur'a22 - хотел выдрать саму функцию, которая телепортирует, но не могу понять, что нужно выдрать.
Вот полный скрипт:
Код:
local levels =
{
{"l01_escape",                          "Кордон"},
{"l02_garbage",                         "Свалка"},
{"l03_agroprom",                      "Агропром"},
{"l03u_agr_underground",  "Подземелье Агропрома"},
{"l04_darkvalley",               "Тёмная Долина"},
{"l04u_labx18",               "Лаборатория Х-18"},
{"l05_bar",                                "Бар"},
{"l06_rostok",                          "Росток"},
{"l08_yantar",                          "Янтарь"},
{"l08u_brainlab",            "Лаборатория Х-16"},
{"l07_military",             "Армейские Склады"},
{"l10_radar",                           "Радар"},
{"l10u_bunker",                        "Бункер"},
{"l11_pripyat",                       "Припять"},
{"l12_stancia",                        "ЧАЭС-1"},
{"l12u_sarcofag",                    "Саркофаг"},
{"l12u_control_monolith",   "Контроль Монолита"},
{"l12_stancia_2",                      "ЧАЭС-2"}
}

class "list_item" (CUIListItemEx) --\\ отдельный класс для ItemList. Обязательное условие.

function list_item:__init() super()
self:SetWndRect (0,0,150,29)

self.fn = CUIStatic ()
self.fn:SetAutoDelete (true)          --включить автоудаление
self:AttachChild (self.fn)       --создать виджет
self.fn:SetWndRect (0,0,150,29)    --задать координаты и размеры виджета
self.fn:SetText ("level_name")  --загрузить текст
self.fn:SetTextY        (6)             --позиция отображения текста по Y
self.fn:InitTexture("ui\\ui_btn_mm_h")  --загрузить текстуру
self.fn:SetOriginalRect(0, 0, 255, 37)  --координаты захвата текстуры из указанного файла dds
self.fn:SetStretchTexture(true)         --растяжка текстуры по размерам виджета
self.fn:SetTextAlign(2)                 --центрировать текст
end

--\\-------------------------------------------------------
--\\ Скрипт мобильного чейнджера
--\\-------------------------------------------------------

class "mobile_changer" (CUIScriptWnd)

--инициализация
function mobile_changer:__init() super()
    local index_level = alife():level_id()
self.name_level = alife():level_name(index_level)
    self:Init(50,50,900,640)
-----------------------------------------
-- интерфейс
self.xml = CScriptXmlInit()
self.xml:ParseFile("_mobile_changer.xml")

self.xml:InitStatic("background", self)

-- список локаций
local list = self.xml:InitList("list", self)
list:ShowSelectedItem(false)
list:EnableScrollBar(true)
self:Register(list, "list_window")
self:AddCallback("list_window", ui_events.LIST_ITEM_CLICKED,   self.OnListItemClicked, self) --клик по итему

for k,v in ipairs(levels) do
    local _itm = list_item()  --\\ класс "list_item"
local fn = _itm.fn         --\\ блок CUIStatic
    fn:SetText( v[2] )
if self.name_level == v[1] then
    fn:InitTexture("ui\\ui_btn_mm_t")
fn:SetOriginalRect(0, 0, 255, 37)
end
list:AddItem(_itm)
    end

-- блок ввода координат
    local vectors       = CUIStatic ()
vectors:SetAutoDelete   (true)
vectors:Init             (225,55,620,80)
vectors:InitTexture      ("ui\\ui_frame_dialog_back")
vectors:SetStretchTexture(true)
self:AttachChild       (vectors)

local vector_x            = self.xml:InitStatic("vector_x", vectors)
local vector_y            = self.xml:InitStatic("vector_y", vectors)
local vector_z            = self.xml:InitStatic("vector_z", vectors)
local vector_lv            = self.xml:InitStatic("vector_lv", vectors)
local vector_gv            = self.xml:InitStatic("vector_gv", vectors)
local vector_ln            = self.xml:InitStatic("vector_ln", vectors)



self.vectorX                 = self.xml:InitEditBox ("edit", vector_x)
self.vectorY                 = self.xml:InitEditBox ("edit", vector_y)
self.vectorZ                 = self.xml:InitEditBox ("edit", vector_z)

self.vectorLV                = self.xml:InitEditBox ("edit", vector_lv)
self.vectorGV                = self.xml:InitEditBox ("edit", vector_gv)
self.vectorLN                = self.xml:InitEditBox ("edit", vector_ln)
self.vectorLN:SetWidth(250)
self.vectorLN:SetText(self.name_level)

-- Enter
    local enter = self.xml:Init3tButton("enter", vectors)
enter:EnableTextHighlighting(true)
self:Register(enter,"enter_but")
self:AddCallback("enter_but", ui_events.BUTTON_CLICKED, self.Enter, self)

-- зона с изображениями
local zone_pic =  CUIStatic ()
zone_pic:SetAutoDelete   (true)
zone_pic:Init             (225,140,620,440)
zone_pic:ClipperOn(true)
self:AttachChild       (zone_pic)

local picX,picY,picW,picH = 30,5,128,96
for i=1, 16 do
    local fX,fY = 1,0
    if i>4 and i<=8 then
fX,fY = 5,1
elseif i>8 and i<=12 then
fX,fY = 9,2
elseif i>12 then
fX,fY = 13,3
end
local picXs = picX + (picW + 10) * (i-fX)
local picYs = picY + (picH + 10) * fY
    local pic = CUIStatic()
    pic:SetAutoDelete (true)
pic:SetWindowName    ("pic"..i)
    pic:Init             (picXs,picYs,picW,picH)
local fon = _change_list.jump_to_level(self.name_level, i)
if fon then
    pic:InitTexture      (fon['pic'])
pic:SetOriginalRect(0, 0, 128, 96)
else
    pic:InitTexture      ("ui\\ui_frame_dialog_back")
end
    pic:SetStretchTexture(true)
    zone_pic:AttachChild (pic)

local btn = CUIButton()
    btn:SetAutoDelete (true)
btn:SetWindowName    ("btn"..i)
    btn:Init             (0,0,picW,picH)
pic:AttachChild (btn)
self:Register(btn)
end
--колбеки изображений 
self:AddCallback("btn1", ui_events.BUTTON_CLICKED, self.Btn_1, self)
self:AddCallback("btn2", ui_events.BUTTON_CLICKED, self.Btn_2, self)
self:AddCallback("btn3", ui_events.BUTTON_CLICKED, self.Btn_3, self)
self:AddCallback("btn4", ui_events.BUTTON_CLICKED, self.Btn_4, self)
self:AddCallback("btn5", ui_events.BUTTON_CLICKED, self.Btn_5, self)
self:AddCallback("btn6", ui_events.BUTTON_CLICKED, self.Btn_6, self)
self:AddCallback("btn7", ui_events.BUTTON_CLICKED, self.Btn_7, self)
self:AddCallback("btn8", ui_events.BUTTON_CLICKED, self.Btn_8, self)
self:AddCallback("btn9", ui_events.BUTTON_CLICKED, self.Btn_9, self)
self:AddCallback("btn10", ui_events.BUTTON_CLICKED, self.Btn_10, self)
self:AddCallback("btn11", ui_events.BUTTON_CLICKED, self.Btn_11, self)
self:AddCallback("btn12", ui_events.BUTTON_CLICKED, self.Btn_12, self)
self:AddCallback("btn13", ui_events.BUTTON_CLICKED, self.Btn_13, self)
self:AddCallback("btn14", ui_events.BUTTON_CLICKED, self.Btn_14, self)
self:AddCallback("btn15", ui_events.BUTTON_CLICKED, self.Btn_15, self)
self:AddCallback("btn16", ui_events.BUTTON_CLICKED, self.Btn_16, self)

self:Btn_print(1)
end

--функция выбора локации
function mobile_changer:OnListItemClicked()
    local list = self:GetListWnd("list_window") --\\определить list
if list:GetSize()==0 then return end        --\\если лист пуст, то завершить выполнение функции

local index = list:GetSelectedItem()        --\\определить индекс нажатого итема
if index == -1 then return end              --\\если не один индекс не активен, то завершить выполнение функции

local item = list:GetItem(index)       --\\определить CUI итема по индексу
local text = item.fn:GetText()         --\\определение текста итема

list:RemoveAll()                            --\\очистим список

for _,v in ipairs(levels) do
    local _itm = list_item()               --\\ класс "list_item"
local fn    = _itm.fn                   --\\ блок CUIStatic
fn:SetText(v[2])
if text == v[2] then
    fn:InitTexture("ui\\ui_btn_mm_t")
fn:SetOriginalRect(0, 0, 255, 37)
self.name_level = v[1]
end
list:AddItem(_itm)
end

for i=1,16 do
    local zone = self:GetStatic("pic"..i)
        local fon = _change_list.jump_to_level(self.name_level, i)
if fon then
    zone:InitTexture      (fon['pic'])
zone:SetOriginalRect(0, 0, 128, 96)
else
    zone:InitTexture      ("ui\\ui_frame_dialog_back")
end
end
self.vectorLN:SetText(self.name_level)
self:Btn_print(1)
end

--функция старта телепортации (Enter)
function mobile_changer:Enter()
    local x = tonumber(self.vectorX:GetText())
local y = tonumber(self.vectorY:GetText())
local z = tonumber(self.vectorZ:GetText())
  --вывод ошибки в координатах
if not x then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в координате Х"), true) return
elseif not y then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в координате Y"), true) return
elseif not z then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в координате Z"), true) return
end
    if alife():level_name(alife():level_id()) == self.name_level then
    self:on_quit()
    db.actor:set_actor_position(vector():set(x,y,z))
else
  --вывод ошибки в вертексах и имени локации
    local lv = tonumber(self.vectorLV:GetText())
    local gv = tonumber(self.vectorGV:GetText())
local lev = self.vectorLN:GetText()
if not lv then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в координате LV"), true) return
    elseif not gv then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в координате GV"), true) return
    elseif not lev then level.start_stop_menu(_mobil_changer.wind_error("Ошибка в имени локации"), true) return
    end
    self:on_quit()
    this.start_level_changer(vector():set(x,y,z), lv, gv, lev)
end
end

--клава
function mobile_changer: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:on_quit()
end
end
return true
end

--выбор секции с координатами
function mobile_changer:Btn_1() self:Btn_print(1) end
function mobile_changer:Btn_2() self:Btn_print(2) end
function mobile_changer:Btn_3() self:Btn_print(3) end
function mobile_changer:Btn_4() self:Btn_print(4) end
function mobile_changer:Btn_5() self:Btn_print(5) end
function mobile_changer:Btn_6() self:Btn_print(6) end
function mobile_changer:Btn_7() self:Btn_print(7) end
function mobile_changer:Btn_8() self:Btn_print(8) end
function mobile_changer:Btn_9() self:Btn_print(9) end
function mobile_changer:Btn_10() self:Btn_print(10) end
function mobile_changer:Btn_11() self:Btn_print(11) end
function mobile_changer:Btn_12() self:Btn_print(12) end
function mobile_changer:Btn_13() self:Btn_print(13) end
function mobile_changer:Btn_14() self:Btn_print(14) end
function mobile_changer:Btn_15() self:Btn_print(15) end
function mobile_changer:Btn_16() self:Btn_print(16) end

function mobile_changer:Btn_print(index)
    local data = _change_list.jump_to_level(self.name_level, index)
if data then
    self.vectorX:SetText(data["pos_x"])
    self.vectorY:SetText(data["pos_y"])
    self.vectorZ:SetText(data["pos_z"])
    self.vectorLV:SetText(data["lvid"])
    self.vectorGV:SetText(data["gvid"])
else
    self.vectorX:SetText('')
    self.vectorY:SetText('')
    self.vectorZ:SetText('')
    self.vectorLV:SetText('')
    self.vectorGV:SetText('')
end

for i=1,16 do
    local btn = self:GetButton("btn"..i)
if index == i then
    btn:InitTexture("ui\\ramka")
else
    btn:InitTexture("ui\\clear")
end
end
end

--выход
function mobile_changer:on_quit()
self:GetHolder():start_stop_menu (self,true)
end

--\\---------------------------------------------
--\\ Окно ошибки координат
--\\---------------------------------------------

class "wind_error" (CUIScriptWnd)

function wind_error:__init(n) super()
    self:Init(380,300,345,212)

self.fon = CUIStatic()
self.fon:Init(0,0,345,212)
self.fon:InitTexture("ui\\ui_trade_list_back")
self.fon:SetText("Error")
self.fon:SetTextX(30)
self.fon:SetTextY(10)
self.fon:SetTextAlign(0)
self:AttachChild (self.fon)

self.text = CUIStatic()
self.text:Init(0,60,345,30)
self.text:SetText(n)
self.text:SetTextAlign(2)
self.fon:AttachChild (self.text)

self.btn = CUI3tButton ()
self.btn:Init("ui\\ui_btn_02", 150,150,45,26)
self.btn:SetText("OK")
self:Register(self.btn, "btn")
self:AddCallback("btn", ui_events.BUTTON_CLICKED, self.Btn, self)
self.fon:AttachChild (self.btn)
end

function wind_error:Btn()
    self:GetHolder():start_stop_menu (self,true)
end

--\\--------------------------------------------------------------------
--\\ Скрипт временного Чейнджера
--\\--------------------------------------------------------------------

function start_level_changer(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level)
local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local packet = net_packet()
obj:STATE_Write(packet)
-- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
-- свойства cse_shape
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
    -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
    -- box
local axis_x                = packet:r_vec3()
local axis_y                = packet:r_vec3()
local axis_z                = packet:r_vec3()
local offset                = packet:r_vec3()
        end
    end
-- свойства cse_alife_space_restrictor
local restrictor_type = packet:r_u8()
-- свойства cse_alife_level_changer
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3()
local dest_direction = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
local dest_graph_point = packet:r_stringZ()
local silent_mode     = packet:r_u8()

-----------------------------------------------------------
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
packet:w_stringZ(custom_data)
    packet:w_u32(46489)
packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
packet:w_u8(3)
packet:w_u16(p_dest_gv)
packet:w_u32(p_dest_lv)
packet:w_vec3(p_dest_pos)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_stringZ(p_dest_level)
packet:w_stringZ("start_actor_99")
packet:w_u8(1)

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

function start_del()
    local obj =  alife():story_object( 46489 )
if obj then
    db.actor:set_fastcall(del_changer, db.actor)
end
end

function del_changer()
local obj =  alife():story_object( 46489 )
if obj then
        local lv_ch = game_graph():vertex(obj.m_game_vertex_id):level_id() --определяем id локации нахождения временного чейнджера
    local lv_ac = alife():level_id()                                   --определяем id текущей локации
    if lv_ch ~= lv_ac then                                             --если не равны
            alife():release(obj, true)                                     --то удаляем временный чейнджер
            end
    end
end

start_del()

Вот это, как я понимаю, спавнится левел_чаннжер прям рядом с ГГ:
Код:
function start_level_changer(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level)
local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local packet = net_packet()
obj:STATE_Write(packet)
-- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
-- свойства cse_shape
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
    -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
    -- box
local axis_x                = packet:r_vec3()
local axis_y                = packet:r_vec3()
local axis_z                = packet:r_vec3()
local offset                = packet:r_vec3()
        end
    end
-- свойства cse_alife_space_restrictor
local restrictor_type = packet:r_u8()
-- свойства cse_alife_level_changer
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3()
local dest_direction = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
local dest_graph_point = packet:r_stringZ()
local silent_mode     = packet:r_u8()

-----------------------------------------------------------
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
packet:w_stringZ(custom_data)
    packet:w_u32(46489)
packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
packet:w_u8(3)
packet:w_u16(p_dest_gv)
packet:w_u32(p_dest_lv)
packet:w_vec3(p_dest_pos)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_stringZ(p_dest_level)
packet:w_stringZ("start_actor_99")
packet:w_u8(1)

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

Я не понимаю, как в функцию спавна перехода передаются координаты, на которые должен перенестись ГГ.Обьсните кто-нибудь?


STALKER 7777
[1] Странник
Онлайн статус=0  Профиль    




Посты: 40
Откуда:
Занятие: сталкер
Возраст: 29

01-08-2010
09-08-2010 13:18 GMT3 часа #1312839   Split
приветствую

я хотел плеер от феррари 314 поставить к себе в свой мод
делал всё по инструкции

но у меня вылет при заходе в игру
лог такой

FATAL ERROR

[error]Expression : fatal error
[error]Function : CInifile::r_section
[error]File : E:\stalker\patch_1_0004\xrCore\Xr_ini.cpp
[error]Line : 342
[error]Description : <no expression>
[error]Arguments : Can't open section 'identity_immunities'


stack trace:

как исправить эту ошибку?

заранее благодарен.


AAAAKKK
[1] Странник
Онлайн статус=0  Профиль    




Посты: 65
Откуда: Кострома
Занятие:
Возраст: 46

13-03-2011
09-08-2010 13:22 GMT3 часа #1312844   Split
Artos 08-08-2010 17:19 GMT

Цитата
Поправка НЕ принимается, т.к. по сути бессмысленна.
Работа гулага там (на той локации), где гулаг! Естественно гулаги могут быть на любой локации и соответственно их работы тоже, но именно на локации соответствующего гулага.
Вспоминаем - работа начинает выполняться по достижении некоторой дистанции до гулага, а значит - соответствующей локации. В теории можно задать рестрикторами работу где-то ... но выполняться она не будет, т.к. флаг достижения гулага будет сбрасываться как только ...


Artos вы заблуждаетесь работа начинает выполнятся не при достижении некоторой дистанции до гулага а при достижении некоторой дистанции до места работы вот цитата всем известной статьи про логику пункт 6 и пункт 7 тоже смотреть

3.11.3. Новые особенности смарттеррейнов
Возможности нового смарттеррейна (СТ):

1) Не держит сталкеров постоянно в онлайне. Работает стандартный онлайн-радиус.
2) Сталкеры идут на ближайшие работы.
3) На места работ сталкеры идут независимо от того, в онлайне они или в оффлайне.
4) СТ в офлайне работает так же, как и в онлайне: выполняет переключение своих состояний, перераспределение работ.
5) Сталкерам можно прописать, при каких условиях в какие СТ они могут идти. (см. ниже) Если сталкер попал в СТ, то онбудет находится в нём, пока не истечёт время и выполняется условие.
6) Работы могут находиться на разных уровнях.
7) Скриптовая зона СТ теперь не используется для захвата персонажей.8) Симуляция заключается в миграции персонажей между разными СТ.


да и если посмотреть файл gulag_general.script (универсальные гулаги) видно что координаты работ данного гулага находяться на разных уровнях правда загружаемых динамически что впрочем не мешает сделать и статически .

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


Цитата
Тоже неудачная попытка поправки/пояснения.
Смарт-терейн - а) объект игры, а не некие преустановки! Он имеет и геометрию (cse_shape properties), т.е. позицию и радиус(ы)! Это именно территория, ограниченная некоей границей. Собственно и само название 'smart terrain' - 'умный ландшафт', т.е. область на локации, в пределах которой работает некая логика.
Ну а уж гулаг - это уже логический/организационный объект, т.е. набор предустановок и пр. ... И есть он или нет - свойства смарта!


Смарт-терейн именно предустановки для гулага никакой геометрии он не имеет (верней имеет но это поБочный эфект работы в СДК (Сказанно не мной а IG-2007)
Параметр (cse_shape properties), вобше ни на что не влияет главное чтоб значение было отлично от нуля хоть 0.34556788 хоть 0.000000001 (проверенно впрочем можете проверить сами)



Не нужно мне пояснять о том что 'некое' условие - инфопоршень. Я пишу общим определением! И если для тебя 'некое' только инфопоршень из оригинальных кодов, то мое определение дает 'свободу' и смена Волка на Фаната, к примеру, может поизводится любым подходящим событием, который взбредет в голову модмейкеру.
И сними шоры! Фанат в игре изначально заспавнен! Хотя собственно это не столь уж важно для конкретного случая для SkyLoader.
Заставить его проявиться, заставить уйти Волка на Склады иль еще чего - не суть разбираемого вопроса.

Фанат изначально присутствует в алл спавне только спаунится при определенных условиях

Зы. Извените если чем-то обидел или задел но истина дороже

SkyLoader.

нет пакет переписывается только если непись в оф лайне


Sine
[1] Странник
Онлайн статус=0  Профиль    




Посты: 960
Откуда: Краснодар
Занятие: брейкданс, модмейкинг
Возраст: 29

09-01-2011
09-08-2010 13:34 GMT3 часа #1312851   Split
STALKER 7777 не может открыть секцию identity_immunities = выход, добавить эту секцию ( =скорее всего это в папке креэйчурс, там в твой файл скопируй эту секцию из других файлов)


Darien Fx
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1372
Откуда:
Занятие:
Возраст: 30

09-08-2010 15:23 GMT3 часа #1312916   Split
AAAAKKK
cse_shape - не один параметр, и отвечают они за тип формы и размер зоны.


AAAAKKK
[1] Странник
Онлайн статус=0  Профиль    




Посты: 65
Откуда: Кострома
Занятие:
Возраст: 46

13-03-2011
09-08-2010 15:35 GMT3 часа #1312928   Split
Darien Fx
Да понимаю я ето только в установках смарт-террайна он ни на что не влияет

в рестрикторе этот пораметр важен

[87]
; cse_abstract properties
section_name = space_restrictor
name = esc_lager_guard_kill_zone
position = -212.610015869141,-22.8791561126709,-122.060478210449
direction = 0,0,0

; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xffffff3e
custom_data = <<END
[logic]
active = sr_idle@lager

[sr_idle@lager]
on_info = {+escape_lager_killers_die} nil, {+esc_return} sr_idle@killers %+esc_fanat_spawn%

[sr_idle@killers]
on_info = {+escape_lager_help !gulag_empty(esc_killers)} sr_idle@fighting

[sr_idle@fighting]
on_info = {=gulag_empty(esc_killers)} nil %+escape_lager_killers_die%
END

; cse_shape properties
shapes = shape0,shape1,shape2,shape3
shape0:type = box
shape0:axis_x = 6.23620176315308,0,0
shape0:axis_y = 0,3.98619985580444,0
shape0:axis_z = 0,0,3.83500003814697
shape0:offset = 0,0,0
shape1:type = box
shape1:axis_x = 7.71732950210571,0,0
shape1:axis_y = 0,24.0907764434814,0
shape1:axis_z = 0,0,17.714391708374
shape1:offset = 47.7419891357422,2.33591651916504,-10.4073867797852
shape2:type = box
shape2:axis_x = 1.57269442081451,0,0
shape2:axis_y = 0,11.6672286987305,0
shape2:axis_z = 0,0,18.4270477294922
shape2:offset = -15.5425109863281,7.22870635986328,-10.7128219604492
shape3:type = box
shape3:axis_x = 61.7394027709961,0,0
shape3:axis_y = 0,18.8940544128418,0
shape3:axis_z = 0,0,49.526496887207
shape3:offset = 16.0246124267578,4.26228523254395,-26.3295516967773
; cse_alife_space_restrictor properties
restrictor_type = 0



а в смарте нет выделенное значение может быть любым только больше 0

[101]
; cse_abstract properties
section_name = smart_terrain
name = esc_lager
position = -208.551208496094,-20.0917911529541,-141.64958190918
direction = 0.062321275472641,0.00316426996141672,0.0140644172206521

; cse_alife_object properties
game_vertex_id = 61
distance = 4.19999980926514
level_vertex_id = 44622
object_flags = 0xffffffbe
custom_data = <<END
[smart_terrain]
type = esc_lager
capacity = 13
squad = 1
groups = 5
respawn = esc_respawn_inventory_box_0000
END

; cse_shape properties
shapes = shape0
shape0:type = sphere
shape0:offset = 0,0,0
shape0:radius = 4.5480751991272
; cse_alife_space_restrictor properties
restrictor_type = 3

; se_smart_terrain properties


singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
09-08-2010 15:48 GMT3 часа #1312935   Split
Stalk15 Так и передавать:

имя файла.start_level_changer(позиция, левел вертекс, гейм вертекс, скриптовое наименование локации)

все передаваемые параметры являются координатами места назначения.

erlik
Здарова. В том то и дело, что размер как положено, даже меньшим делал, как по пикселам, так и по ёмкости.
Про C#, я уже забыл как он выглядит
У меня щас временная передышка. Занялся ремонтом квартиры. Вот и решил вспомнить Сталкера. Както потянуло по новой.


Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
09-08-2010 16:50 GMT3 часа #1312996   Split
Что-то не получается.Вот функция:
Код:
function test()
this.test22222(vector():set(156.42, 0.17, 71.66), 41158, 1180, l05_bar)
end



test()

function test22222(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level)
local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local packet = net_packet()
obj:STATE_Write(packet)
-- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
-- свойства cse_shape
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
    -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
    -- box
local axis_x                = packet:r_vec3()
local axis_y                = packet:r_vec3()
local axis_z                = packet:r_vec3()
local offset                = packet:r_vec3()
        end
    end
-- свойства cse_alife_space_restrictor
local restrictor_type = packet:r_u8()
-- свойства cse_alife_level_changer
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3()
local dest_direction = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
local dest_graph_point = packet:r_stringZ()
local silent_mode     = packet:r_u8()

-----------------------------------------------------------
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
packet:w_stringZ(custom_data)
    packet:w_u32(46489)
packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
packet:w_u8(3)
packet:w_u16(p_dest_gv)
packet:w_u32(p_dest_lv)
packet:w_vec3(p_dest_pos)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_stringZ(p_dest_level)
packet:w_stringZ("start_actor_99")
packet:w_u8(1)

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

Пишет ошибку:new_test.script:2:_attempt_to_index_global_'this'_(a_nil_value).Если поменять местоположение функций:
Код:
function test()
this.test22222(vector():set(156.42, 0.17, 71.66), 41158, 1180, l05_bar)
end

function test22222(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level)
local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local packet = net_packet()
obj:STATE_Write(packet)
-- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
-- свойства cse_shape
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
    -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
    -- box
local axis_x                = packet:r_vec3()
local axis_y                = packet:r_vec3()
local axis_z                = packet:r_vec3()
local offset                = packet:r_vec3()
        end
    end
-- свойства cse_alife_space_restrictor
local restrictor_type = packet:r_u8()
-- свойства cse_alife_level_changer
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3()
local dest_direction = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
local dest_graph_point = packet:r_stringZ()
local silent_mode     = packet:r_u8()

-----------------------------------------------------------
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
packet:w_stringZ(custom_data)
    packet:w_u32(46489)
packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
packet:w_u8(3)
packet:w_u16(p_dest_gv)
packet:w_u32(p_dest_lv)
packet:w_vec3(p_dest_pos)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_stringZ(p_dest_level)
packet:w_stringZ("start_actor_99")
packet:w_u8(1)

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

test()

то вылетает без лога.Пробовал отдельно функции pасположить, все равно - вылет без лога:
Код:
function test()
имя_файла.test22222(vector():set(156.42, 0.17, 71.66), 41158, 1180, l05_bar)
end

test()

Подскажите, в чем дело?


singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
09-08-2010 17:16 GMT3 часа #1313019   Split
Stalk15 Я так понимаю ты активируешь функцию через dofile(...). Если нет. Если вызов производится на момент загрузки, то ничего удивительного.
В первом случае ошибку получил изза того, что чтение стартовой функции производилось раньше загрузки основной функции. Во втором ... уточни на счёт вызова.


Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
09-08-2010 17:42 GMT3 часа #1313027   Split
singapur22
Да, через dofile(...).Ща попробовал вызвать по обычному - через диалог:
<action>for_chek.test</action>
Файл for_chek:
Код:
function test()
news_manager.send_tip(db.actor, "шшщш.", 0, "trader", 7000)
this.test22222(vector():set(156.42, 0.17, 71.66), 41158, 1180, l05_bar)
end


function test22222(p_dest_pos, p_dest_lv, p_dest_gv, p_dest_level)
local obj = alife():create("level_changer", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local packet = net_packet()
obj:STATE_Write(packet)
-- свойства cse_alife_object
    local game_vertex_id     = packet:r_u16()
    local distance           = packet:r_float()
    local direct_control     = packet:r_u32()
    local level_vertex_id    = packet:r_u32()
    local object_flags       = packet:r_u32()
    local custom_data        = packet:r_stringZ()
    local story_id           = packet:r_u32()
    local spawn_story_id     = packet:r_u32()
-- свойства cse_shape
    local shape_count = packet:r_u8()
    for i=1,shape_count do
        local shape_type = packet:r_u8()
        if shape_type == 0 then
    -- sphere
            local center = packet:r_vec3()
            local radius = packet:r_float()
        else
    -- box
local axis_x                = packet:r_vec3()
local axis_y                = packet:r_vec3()
local axis_z                = packet:r_vec3()
local offset                = packet:r_vec3()
        end
    end
-- свойства cse_alife_space_restrictor
local restrictor_type = packet:r_u8()
-- свойства cse_alife_level_changer
local dest_game_vertex_id = packet:r_u16() 
local dest_level_vertex_id = packet:r_u32() 
local dest_position = packet:r_vec3()
local dest_direction = packet:r_vec3()
local dest_level_name = packet:r_stringZ()
local dest_graph_point = packet:r_stringZ()
local silent_mode     = packet:r_u8()

-----------------------------------------------------------
packet:w_begin(game_vertex_id)
packet:w_float(distance)
packet:w_u32(direct_control)
packet:w_u32(level_vertex_id)
packet:w_u32( bit_not(193) )
packet:w_stringZ(custom_data)
    packet:w_u32(46489)
packet:w_u32(46489)
    packet:w_u8(1)
    packet:w_u8(0)
    packet:w_vec3(vector():set(0, 0, 0))
    packet:w_float(2)
packet:w_u8(3)
packet:w_u16(p_dest_gv)
packet:w_u32(p_dest_lv)
packet:w_vec3(p_dest_pos)
packet:w_vec3(vector():set(0, 0, 0))
packet:w_stringZ(p_dest_level)
packet:w_stringZ("start_actor_99")
packet:w_u8(1)

packet:r_seek(0)
obj:STATE_Read(packet, packet:w_tell())
end

Сообщение выводится,а ГГ не телепортируется.

---------------------------------------------------------------------
singapur22
А, точно, не заметил.Спасибо.

Сообщение было успешно отредактировано Stalk15 (09-08-2010 17:42 GMT3 часа, назад)

singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
09-08-2010 17:36 GMT3 часа #1313033   Split
Stalk15

l05_bar --это должна быть строка!!!
Тобишь возьми её в кавычки. Иначе вместо параметра ты передаёшь значение nil.


vhodnoylogin
[1] Странник
Онлайн статус=0  Профиль    




Посты: 211
Откуда:
Занятие:
Возраст: 34

09-08-2010 20:19 GMT3 часа #1313146   Split
Люди, здравствуйте.
Итак, вопрос(ы):
В конфигах оружия прописаны различные параметры, и игра их использует. То есть как-то получает значения этих параметров.
А как человеку получить значения этих параметров? А именно: как статичные (скорострельность, макс. объем рожка), так и изменяемые (кол-во патронов, повреждение ствола)...
Должен же быть метод для их получения?

Есть ли функция для отслеживания выстрела? Если ГГ произвел выстрел, возвращает true, а то отслеживать через изменение кол-ва патронов в рожке не всегда возможно.


Darien Fx
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1372
Откуда:
Занятие:
Возраст: 30

09-08-2010 21:07 GMT3 часа #1313179   Split
vhodnoylogin
Для этого есть класс.
Код:
C++ class ini_file {
    ini_file (string);

    function line_count(string);
    function r_bool(string, string);
    function section_exist(string);
    function r_float(string, string);
    function r_clsid(string, string);
    function r_s32(string, string);
    function r_line(ini_file*, string, number, string&, string&);
    function r_token(string, string, const token_list&);
    function r_vector(string, string);
    function r_u32(string, string);
    function r_string_wq(string, string);
    function r_string(string, string);
    function line_exist(string, string);
};

Примеров куча, ближе всего - у erlik'а в заметке 'Рандомный хабар для тайников'.


erlik
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2338
Откуда: Набережные Челны
Занятие: В чем сила, брат? В AutoIT3 и WinAPI.
Возраст: 47

18-03-2015
09-08-2010 21:53 GMT3 часа #1313181   Split
vhodnoylogin
Все параметры можно считать из конфиг файла нужного ствола. Есть специальные методы - описанные в справочнике по функциям и классам.
Простой пример - считываем размер магазина у калаша
local SizeMagazin = system_ini():r_u32("wpn_ak74", "ammo_mag_size")
system_ini() - метод обращения к конфигурационным файлам игры указанных в файле sistem.ltx. К нему и применяются методы чтения.
Так как параметр ammo_mag_size - 32 разрядное целое число, то и метод чтения - r_u32( ) - соответствующий.
Для считывания string - строки - есть другой метод. Также как и для разных типов чисел, векторов, булевых значений и т.д.
Состояние ствола\брони можно узнать через метод condition().
Дефолтной функции от разрабов для отслеживания выстрела не существует - есть только самописные варианты - через изменение кол-ва патронов в рожке например. Или через хит_каллбек в xr_motivator'e.

А вот тебе и Darien Fx список методов чтения привел - разбирайся.

добавлено спустя 26 минут
------------------------------------------------------------------------------------------------------------------------
Кстати недавно баловался с каллбеками и выяснил, что их можно устанавливать точечно(без использования имеющихся биндеров) - на конкретные объекты, если конечно объект поддерживает хоть какой-нибудь каллбек.
Вот так можно на волка поставить каллбек на хит

Код:
function WolfCall()
local obj = level_object_by_sid(6)
   obj:set_callback(callback.hit, Callback)
end

После вызова этой функции при наступлении нужного события указанная как аргумент функция Callback(имя задается произвольное) будет вызвана. То бишь например пишем
function Callback()
news_manager.send_tip(db.actor, "Волк получил хит", 0, nil, 5000)
end
И при хите волка получим сообщение.


На NPC\тачках\дверях\ящиках работает каллбек на юз - callback.use_object.

Код:
function BoxCall()
local oSBox = alife():object("level_prefix_inventory_box_0003")  -- неуловимый ящик сидора :-)
local oCBox = level.object_by_id(oSBox.id)  -- получаем клиентский объект - иначе нельзя.
    if  oCBox then
    oCBox:set_callback(callback.use_object, RandomSpawnItems)
news_manager.send_tip(db.actor, "Каллбек на ящик установлен", 0, nil, 5000)
oCBox:set_tip_text("Руки прочь от чужого добра!!!")  -- всплывающая надпись при наведении на предмет.
      end
end


Также на NPC можно поставить callback.death.
Отменить\аннулировать каллбек можно так obj:set_callback(callback.use_object, nil) -- вместо имени функции указываем nil - и данный каллбек для этого объекта больше не вызывается - пока заново не установить.

Сообщение было успешно отредактировано erlik (09-08-2010 21:53 GMT3 часа, назад)

vhodnoylogin
[1] Странник
Онлайн статус=0  Профиль    




Посты: 211
Откуда:
Занятие:
Возраст: 34

10-08-2010 01:26 GMT3 часа #1313369   Split
Еще пару вопросов:
есть ли различие между предметом в инвентаре и им же, но на земле (помещаясь в инвентарь, предмет получает новое ID)? Или, спрашивая по-другому, существует некое "инвентарное" ID?



На счет ф-ии condition(): что она делает? Может выдать информацию о стволе или изменять этот параметр?
Или это перегрузка:
condition() - инфа
condition(num) - "лечение" ствола (где num - (float?) от 0.0 до 1.0)




НА счет проверки наличия выстрела. Можно ли проверить выстрел по косвенным признакам: а именно, по анимации выстрела (патикл, кажется так называется)? Или через отслеживание нажатия на кнопку выстрела (но это трудно - возникают многие другие вопросы)...




PS:
Dietrich2009, а где ты такую аватарку нашел? Интересно знать источник.

Сообщение было успешно отредактировано vhodnoylogin (10-08-2010 01:26 GMT3 часа, назад)

Чувак на болоте
[1] Странник
Онлайн статус=0  Профиль    




Посты: 87
Откуда: Волгодонск
Занятие: мастер 3д моделей, так же рулю в СДК)_)
Возраст:

03-07-2011
10-08-2010 00:19 GMT3 часа #1313377   Split
Люди добрые помогите ответом - как увеличить скорость регенирации здоровья?


vhodnoylogin
[1] Странник
Онлайн статус=0  Профиль    




Посты: 211
Откуда:
Занятие:
Возраст: 34

10-08-2010 01:39 GMT3 часа #1313403   Split
Чувак на болоте, лично я знаю такой способ:
satiety_v - ;скорость уменьшения сытости со временем
satiety_health_v - ;увеличение здоровья при уменьшении сытости
Из этого следует, что ты ставишь большое значение для satiety_health_v и малое для satiety_v.
Сам таким методом пользовался этим способом и не понимал, почему я так быстро лечусь сам.




Раз о конфигах, то: что такое мораль, зачем нужна и что дает?

Сообщение было успешно отредактировано vhodnoylogin (10-08-2010 01:39 GMT3 часа, назад)

erlik
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2338
Откуда: Набережные Челны
Занятие: В чем сила, брат? В AutoIT3 и WinAPI.
Возраст: 47

18-03-2015
10-08-2010 02:13 GMT3 часа #1313434   Split
vhodnoylogin
condition() возвращает состояние предмета к которому это метод применяется. Аргументов у метода нет.
Ремонт\ломание ствола не condition(num) - а set_condition(num) -аргумент число от 0 до 1 - где 0 будет ствол в хлам, а 1 - как новенький. Оба методы применяются к клиентской юзердате объекта.
Айдишка вроде как не меняется (хотя высказывались мнения что все таки меняется в процессе игры) - но по моему опыту могу сказать что от перемещения объекта с земли в инвентарь и обратно айди не меняется.
Инвентарного айди нет,но есть порядковый номер инвентарного объекта в массиве куда заносятся все объекты инвентаря - при итерации рюкзака\массива объектов рюкзака как раз можно использовать эти порядковые номера через метод object(число)
local cnt = db.actor:object_count() -- возвращает кол-во объектов в инвентаре ГГ
for i=0,cnt-1 do -- итерация номеров
local item = db.actor:object(i) --возвращает объект по его номеру в инвентаре
и номера эти если объект поперемещать туда-сюда как раз меняются.
-----------------------------------------------------------------------------------
Отследить нажатие ЛКМ (как и ПКМ) напрямую нельзя - не предусмотрено(разве что кейлоггером). Только косвенно. Как - уже писалось. ПКМ можно по изменению accuracy() - точности. По анимации выстрела - не представляю как.

Сообщение было успешно отредактировано erlik (10-08-2010 02:13 GMT3 часа, назад)

Artos
[20] Сталкер
Онлайн статус=0  Профиль    




Посты: 4176
Откуда:
Занятие:
Возраст: 65

10-08-2010 04:02 GMT3 часа #1313474   Split
AAAAKKK
Что-то часто заучат фразы о поправкахи заблуждениях, при чем аргументация ... "а вот прочти там ..."
Начну с конца (так проще):
Цитата
нет пакет переписывается только если непись в оф лайне
Абсолютно неверное утверждение. Если объект существует, то изменение (перезапись) нет-пакета объекта возможна условно В ЛЮБОЙ момент времени (главное не попасть в момент 'штатной' перезаписи, чтобы не возникли коллизии). Иное дело, что внесенные изменения могут проявиться не сразу, а по прошествии некоторого времени. Для ускорения этого процесса можно использовать принудительный метод, отравляя объект в офф-лайн и возврат его в он-лайн с уже обновленными параметрами.
Собственно изменения/перезапись нет пакетов происходят для серверных объектов, для которых состояние 'он-лайн' - только некоторое состояние одного из параметров, и неясно чем вызвана такая категоричность процитированной фразы.
Не вижу смысла далее дискутировать на тему смартов/гулагов, т.к. диалог идет на разных языках. Во-первых, мы все тут пишем не научные трактаты, а достаточно сжатые сообщения, в которых порой нет цели максимально правильно и всесторонне формулировать все затронутые понятия. И во-вторых, если уж затрагивается/оспаривается одно, то не перескакивают на следующее ... Если цель - достижение правильного толкования и практического применения, то диалог возможен далее. Если же цель - перебрасывание субъективными аксиомами - не вижу смысла далее продолжать.
Меня поправляешь отказывая смарту в признаке 'территории', называя объект - предустановками, забывая, элементарное: точка - это тоже площадь, хотя и выродившаяся до точки.
Итак, смарт-террейн это объект, имеющий некий центр, радиус , т.е некая территория или же начнем опять приводить крайности и необязательности, нивелируя его до 'предустановки'?

Не стОит мне в качестве аргументов приводить некие статьи, даже написанные кем-либо из разрабов.
а) Никогда всех нюансов кодов не описать в статье для 'остальных'
б) После написания коды были не раз изменены.
... и т.д.
Взгянув не в статью, а в коды (не призываю их анализировать и делать выводи исходя из них), но даже комменты самих разрабов уже опровергают:
Цитата
--/ условия достижения персонажем места работы:
--/ а) в офлайне: персонаж пришёл на нужную точку графа
--/ б) в онлайне: персонаж продошёл на расстояние iJobPositionThreshold
Для чего(?) приводить тавтологию типа:
Цитата
... работа начинает выполнятся не при достижении некоторой дистанции до гулага а при достижении некоторой дистанции до места работы ...

Есть точка отсчета - гулаг, он же смарт-террейн, от него отсчитывается некая дистанция 'Job.position_threshold', которая считается 'дистанцией/позицией достижения работы'. Что неправильного в первоначальной моей фразе???
Расстояние от города до города можно считать хоть от окраины до окраины, хоть от центра, до цента. Но(!) базовой точкой отсчета будет все равно ЦЕНТР, о не производная от него.
Все далее лень писать ...



erlik
Однозначно, игровой идентификатор объектов в игре (ID) назначается один раз (при первичном спавне) и неизменен на всем протяжении игры или до уничтожения объекта.
Каких либо метаморфоз с идентификатором при перемещении объекта в рюкзак иль еще куда и обратно НЕ происходит.
Те, кто утвердает/высказывает обратное мнение путают банальное - при некоторых операциях с рюкзачными предметами порой объект удаляется и спавнится вновь или нечто аналогичное. Естественно у 'него' будет иной ID, но это у же и не 'тот' же объект!


singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
10-08-2010 08:09 GMT3 часа #1313519   Split
vhodnoylogin
erlik
Artos


Определить, находится объект в инвентаре, или на земле достаточно просто. Для этого имеется соответствующий метод obj:parent() для клиентского объекта. Возвращает userdata материнского объекта. Тоесть, при перемещении объекта в какой либо инвентарь, объект становится дочерним. Это и будет различием. Если объект не дочерний, то метод вернёт nil. Вот тут то и существует некоторая неясность. По существу перемещённый, да и просто заспавненый объект в инвентарь не удаляется и не переводится в оффлайн. Он остаётся в онлайне, но при этом не отображается. Смею предположить, что дочерние элементы просто напросто не считываются рендерингом. Но может быть и другая предустановка.
Так же есть и переменная для определения материнства серверного объекта sobj.parent_id. Возвращает айди материнского объекта, тобишь инвентаря.

erlik Кстати. Поздравляю с повышением!!! Обмывал?


Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
10-08-2010 11:41 GMT3 часа #1313592   Split
erlik
Спасибо за написанное про колбеки, теперь мне понятно, для чего они нужны.

А можно как-нибудь поставить колбэк на то, что ГГ обыскал тайник и опустошил его?
Или как можно опредилить, забрал игрок все вещи из тайника или нет?


KontrolЛер
[1] Странник
Онлайн статус=0  Профиль    




Посты: 367
Откуда:
Занятие:
Возраст: 33

10-08-2010 11:44 GMT3 часа #1313593   Split
Люди помагите! А как можно создать своего персонажа?


Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
10-08-2010 11:46 GMT3 часа #1313594   Split


singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
10-08-2010 12:08 GMT3 часа #1313607   Split
Stalk15 Ты чёта плохо врубился в понятие колбэка. Это во первых, а во вторых имеется определённый список колбэков:

Код:
C++ class callback {
    const action_animation = 20;
    const action_movement = 18;
    const action_object = 23;
    const action_particle = 22;
    const action_sound = 21;
    const action_watch = 19;
    const actor_sleep = 24;
    const article_info = 12;
    const death = 8;
    const helicopter_on_hit = 26;
    const helicopter_on_point = 25;
    const hit = 16;
    const inventory_info = 11;
    const inventory_pda = 10;
    const level_border_enter = 7;
    const level_border_exit = 6;
    const map_location_added = 14;
    const on_item_drop = 28;
    const on_item_take = 27;
    const patrol_path_in_point = 9;
    const script_animation = 29;
    const sound = 17;
    const take_item_from_box = 33;
    const task_state = 13;
    const trade_perform_operation = 3;
    const trade_sell_buy_item = 2;
    const trade_start = 0;
    const trade_stop = 1;
    const trader_global_anim_request = 30;
    const trader_head_anim_request = 31;
    const trader_sound_end = 32;
    const use_object = 15;
    const zone_enter = 4;
    const zone_exit = 5;


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

Сообщение было успешно отредактировано singapur22 (10-08-2010 12:08 GMT3 часа, назад)

Artos
[20] Сталкер
Онлайн статус=0  Профиль    




Посты: 4176
Откуда:
Занятие:
Возраст: 65

10-08-2010 12:25 GMT3 часа #1313625   Split
singapur22
Собственно я давал подтверждение по Неизменности игрового ID объекта.
Ну по 'parent_id', я бы не назвал достаточно простым определение нахождения в инчентаре.
1. Само понятие 'в инвентаре' - расплывчато для игроков. Если считать по 'parent_id' (идентификатору владельца), но находясь в руках/слотах/поясе - это вроде как не в инвентаре, т.е. путаница. Есть и более неочевидные моменты. Из вопроса vhodnoylogin онозначно понять что его интересует невозможно.
2. Все же метод 'obj:parent()' и переменная sobj.parent_id - методы определения владельца, коим не обязательно может быть актор или непись. Это могут быть и ящики и пр. , т.е. однозначности в принадлежности к инвентори тут нет.
3. Как ты сам указал, метод obj:parent() для клиентского объекта, т.о. существуют моменты/периоды, когда объест уже/еще НЕ в инвенторе. Задержки изменения признака 'parent' - от 3-4 апдейтов актора. Это следует учитывать.


singapur22
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2089
Откуда: Рубцовск
Занятие: Проект "Мобила модмейкера"
Возраст: 44

13-08-2011
10-08-2010 12:48 GMT3 часа #1313632   Split
Artos Это всё понятно. Я лишь обобщённо прояснил ситуацию. Точнее я понял так, что vhodnoylogin понадобилось узнать имеет ли объект хоть какието различия находясь в инвентаре или на воле. Вот я и выдвинул метод определения, который именно за это и отвечает. А то, что объект может быть как в инвентаре актора, или в ящике, сути не меняет. В обоих случаях объект становится дочерним. Всё остальное примочки распределения дочерних объектов. С нпс вообще сложная конструкция. Первая ступень дочерности именно инвентарь, после него уже идёт пояс и всё остальное. Не будем вдаваться в подробности, это уже отдельная тема которая никакого отношения к данному случаю не имеет.
А на счёт тебя, скажу так. Довольно расплывчато написал. Тобишь я не совсем понял. Вот и отметил. Извиняй, если что.

Сообщение было успешно отредактировано singapur22 (10-08-2010 12:48 GMT3 часа, назад)

erlik
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2338
Откуда: Набережные Челны
Занятие: В чем сила, брат? В AutoIT3 и WinAPI.
Возраст: 47

18-03-2015
10-08-2010 13:15 GMT3 часа #1313633   Split
Stalk15
В bind_stalker есть что то типа каллбека на взятие вещи из ящика:
actor_binder:take_item_from_box(box, item)
функция возвращает юзердату ящика и объекты взятых итемов.

проверка на то что ящик пустой if box:is_inv_box_empty() == true then -- не помню работает ли.
Можешь на ящик (например какой то один конкретный) поставить каллбек на юзание тем способом что я описал, а в функции которая будет вызываться при обыске ящика поставить указанную проверку на пустой ли ящик. И если пустой - то нужное действие.
--------------------------------------------------------------
Проверил - проверка на пуст ли ящик - работает.
Но срабатывает только на вторичный юз ящика - уже после его опустошения.
Так что тут придется видимо ставить на апдейт эту проверку - если ты хочешь чтобы она срабатывала сразу же после того, как из ящика изъяли все вещи. Или ящик на fastcall поставить.

Сообщение было успешно отредактировано erlik (10-08-2010 13:15 GMT3 часа, назад)

Stalk15
[1] Странник
Онлайн статус=0  Профиль    




Посты: 1023
Откуда: Как-бэ Новосибирск(Точно не знаю=))
Занятие: Модю сталкера, полегоньку юзаю Visual Basic и Visual С#.
Возраст: 30

19-11-2012
10-08-2010 13:38 GMT3 часа #1313649   Split
erlik
Спасибо, я тоже проверил
Думал, что можно такой колбэk поставить:take_item_from_box, но что-то не сработал.
Значит апдейтом надо.

добавлено спустя 7 минут

Хотел проверить, как работает fastcall - так заглючило.Идет Клиент:Синхроризация, а потом бац - опять идет загрузка сейва, потом пару раз все потухло и вылетело.Если что, вот как я делал:
В actor_binder:net_spawn(data):
Код:
for_chek.test()

Файл for_chek:
Код:
local fast = false
function test()
if not fast then
db.actor:set_fastcall( fastcall, db.actor )
fast = not fast
end
end

function fastcall()
    this.fastgeg()
end

function fastgeg()
if db.actor:object("medkit") then
news_manager.send_tip(db.actor, "Апдейт пашет", 0, nil, 5000)
end
end

Может, что не правильно сделал?

Сообщение было успешно отредактировано Stalk15 (10-08-2010 13:38 GMT3 часа, назад)

erlik
[10] Житель
Онлайн статус=0  Профиль    




Посты: 2338
Откуда: Набережные Челны
Занятие: В чем сила, брат? В AutoIT3 и WinAPI.
Возраст: 47

18-03-2015
10-08-2010 18:37 GMT3 часа #1313666   Split
Stalk15
На net_spawn вызов я не ставил. У меня именно на апдейте фасткал вызывается при каждой загрузке
- для моей гравипушки.
В общем я сейчас замутил такую хитрую штуку

Код:
-- функция установки быстрого обработчика -  вызывается каллбеком
function BoxFastcall(oCBox)
   if  oCBox then
    oCBox:set_fastcall( BoxEmpty, oCBox)-- передаем имя функции, которая будет вызываться обработчиком и объект
   end
end

-- функция которая вызывается фасткаллом
function BoxEmpty(oCBox)
    if  oCBox then
       if oCBox:is_inv_box_empty() then  -- если ящик пустой
     news_manager.send_tip(db.actor, "Ящик пустой ", 0, nil, 5000)
        oCBox:set_fastcall(nil, nil)  -- фаскалл отключаем
      end
   end
end

-- функция установки  каллбека(активируется единожды) на юз ящика
function BoxCall(oCBox)
    oCBox:set_callback(callback.use_object, BoxFastcall)
news_manager.send_tip(db.actor, "Каллбек на ящик установлен", 0, nil, 5000)
oCBox:set_tip_text("Руки прочь от чужого добра!!!")
end

function SpawnBoxInBunker() -- функция активации каллбека
local oSBox = alife():object("level_prefix_inventory_box_0003")
   if oSBox== nil then
    news_manager.send_tip(db.actor, "Серверный объект ящика не существует", 0, nil, 5000)
    return end
    local oCBox = level.object_by_id(oSBox.id)
    if  oCBox then
level.map_add_object_spot_ser(oCBox:id(), "user", "Метка на ящик Сидора")
this.BoxCall(oCBox)  -- вызов функции установки каллбека
   end
end


Теперь как только ящик опустошить - получим сообщение, что он пуст.

--------------------------------------------------------------------
Darien Fx
Об этом я не подумал - хотел передавать объект через скобки в вызове - а раз можно так, то еще лучше
-------------------
Проверил - каллбек также объект передает. Исправил весь код на более компактный вариант.
Спасибо за подсказку.
-------------------------------------------------------------------------------------------------
Stalk15
Цитата
Думал, что можно такой колбэk поставить:take_item_from_box, но что-то не сработал.

Для объектов ящиков этот каллбек действительно не пашет - он только для эктора - то есть ставится на объект эктора и вызывается при взятии им вещи из какого либо инвентарного ящика. И если не пользоваться вызовом из биндера эктора, а установить его вручную
Код:
db.actor:set_callback(callback.take_item_from_box, TakeItemFromBox)

то все также работает как и с вызовом из биндера.
Код:
function TakeItemFromBox(oCBox, item)
news_manager.send_tip(db.actor, "Каллбек сработал", 0, nil, 5000)
   if  oCBox and item then
  news_manager.send_tip(db.actor, "Из ящика с айди "..tostring(oCBox:id()).." изъят "..item:section(), 0, nil, 5000)
   else
   news_manager.send_tip(db.actor, "Объект ящика"..tostring(oCBox).." предмет "..tostring(item), 0, nil, 5000)
   end
end

Сообщение было успешно отредактировано erlik (10-08-2010 18:37 GMT3 часа, назад)



Форумы > Архив > Склад > Вопросы и ответы (ТЧ по 11.09.10)

Страница 20 из 69Первая«17181920212223 »Последняя


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



???????@Mail.ru Rambler's Top100
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для
просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.

Использование материалов сайта возможно с разрешения администрации. Все права защищены. © 2004–2024 «Stalker-Portal.ru»