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

[SoC] Ковыряемся в файлах


Halford

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

возможно в принципе создание перемешаюшегося рестриктора и возможноли его повесить на определенного НПС

чтоб рестриктор перемешался вместе с НПС ?

В принципе можно - просто рестриктор не преремещается а каждый раз создается заново, старый же уничтожается

и отслеживаешь периодически положение npc, например через bind_stalker

глянь был хороший пример - создание телепорта внутри уровня

function actor_update(delta)

local i,v,acter_poz,s

 

-- Получим позицию актера (что-бы каждый раз не запрашивать)

acter_poz = db.actor:position()

 

-- Проверяем наши телепорты

for i, v in pairs(teleport_binders) do

s = v.parametrs

 

local obj = level.object_by_id( i )

if obj ~= nil then

-- Наш телепорт в онлайне проверяем дальше

if s.teleporte ~= nil and s.teleporte ~= false then

-- Телепорт запущен

if ( time_global() <= s.time ) then

-- Если время отведенное на показ спецэфектов

-- прошло, производим телепортацию

teleportate(s.poz_x,s.poz_y,s.poz_z)

if s.rotate ~= nil then

db.actor:set_actor_direction(s.rotate)

end

s.teleporte = false

end

return

end

 

-- Пороверим не забрел-ли актер в наш телепорт

if (abs_comp(s.x, acter_poz.x)< v.parametrs.radius and

abs_comp(s.z, acter_poz.z)< v.parametrs.radius and

abs_comp(s.y, acter_poz.y)< v.parametrs.z_radius) then

-- Актер в зоне действия телепорта, запустим телепорт

s["teleporte"] = true

s["time"] = time_global() + 500

 

-- Запускаем спецэфекты телепортации

level.add_pp_effector ("teleport.ppe", 2006, false)

end

end

end

end

 

function bind( obj )

obj:bind_object( restrictor_teleport( obj ) )

end

 

----------------------------------------------------------------------------------------------------

class "restrictor_teleport" ( object_binder )

 

function restrictor_teleport:__init(obj, char_ini) super(obj)

end

 

function restrictor_teleport:net_spawn(data)

local char_ini = system_ini()

 

-- Если это телепорт то занесем его в специальный список телепортов

if self.teleport == true then

teleport_binders[self.object:id()] = self

 

-- Заполним таблицу параметров

self["parametrs"] = {}

if char_ini:line_exist(self.section, "radius") then

self.parametrs["radius"] = tonumber(char_ini:r_string(self.section, "radius"))

else

self.parametrs["radius"] = 2 -- Дефолтный радиус по xy

end

if char_ini:line_exist(self.section, "z_radius") then

self.parametrs["z_radius"] = tonumber(char_ini:r_string(self.section, "z_radius"))

else

self.parametrs["z_radius"] = self.parametrs["radius"] -- если радиус высоты не задан то задаем равным радиусу xy

end

 

-- Запомним позицию что-бы каждый раз не считать

local s_obj = alife():object(self.object:id())

self.parametrs["x"] = tonumber(s_obj.position.x);

self.parametrs["y"] = tonumber(s_obj.position.y);

self.parametrs["z"] = tonumber(s_obj.position.z);

 

-- Запомним координаты куда телепортимся

self.parametrs["poz_x"] = tonumber(char_ini:r_string(self.section, "poz_x"))

self.parametrs["poz_y"] = tonumber(char_ini:r_string(self.section, "poz_y"))

self.parametrs["poz_z"] = tonumber(char_ini:r_string(self.section, "poz_z"))

 

if char_ini:line_exist(self.section, "rotate") then

self.parametrs["rotate"] = tonumber(char_ini:r_string(self.section, "rotate"))

end

end

return true

end

 

function restrictor_teleport:net_destroy()

-- Удаляем наш телепорт

teleport_binders[self.object:id()] = nil

self.parametrs = nil

object_binder.net_destroy(self)

end

 

function restrictor_teleport:reload(section)

local char_ini = system_ini()

 

self.section = section

-- Если это телепорт то

if char_ini ~= nil and char_ini:line_exist(self.section, "teleport") then

self["teleport"] = true

end

end

 

Для постоянного обновления нужно прицепить функцию actor_update() к биндеру актера, для чего в файле bind_stalker.script найдем функцию:

function actor_binder:update(delta)

В ней найдем вызов обновления рестрикторов bind_restrictor.actor_update(delta) под которым вставим строку с вызовом нашей функции обновления: bind_mteleport.actor_update(delta)

 

 

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


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

max_max_08

Привет всем, подскажите как сделать вызов функции из меню, тоесть зашел в меню жмакул на опред. кнопку функция выполнилась. И еще при наличии предмета в инвертаре нужно вызвать функцию.

 

посмотри ADVANCED CHEAT SPAWNER

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


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

Gonarh,

опрос: мне нужно сделать так чтобы переключение происходило при проверке двух функций чото типа func1 и func2, как должна выглядеть в таком случае строка?

сделать func3 в которой проверяются func1 и func2

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


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

Monnoroch,

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

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


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

сделай от противного

function имя()

if level.get_time_hours() <= 5 then

return false

else

return true

end

end

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


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

Полтергейст,

а не проще поставить проверку на nill ?

 

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


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

Ray,

1. Да глобальны

2. Важны для диалогов (их ветвление)

3. Квесты

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


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

кровоSTALKER,

осталась:

else

db.actor:give_info_portion("clock_activ")

end

в эту часть ветки if

ты попадаешь только если db.actor РАВЕН nil

и тогда нет смысла в

db.actor:give_info_portion("clock_activ")

должно быть что то вроде этого:

if db.actor ~= nil then
    if db.actor:object("clock") ~= nil
        return true
    else
        db.actor:give_info_portion("clock_activ") -- это код сработает когда  db.actor ~= nil И db.actor:object("clock") РАВЕН nil
    end
else
    return false
end

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

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


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

кровоSTALKER,

у меня такая ошибка

attempt to index global

выскакивала когда делал ошибку в синтаксисе скрипта (лишняя скобка, не хватает где то "end" и т.д.)

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


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

Garry_Galler,

1. А зачем ты это делаешь через while разве if не подойдет?

2. А код у тебя где стоит в bindstalker.script ? - он же вызывается раз в несколько секунд может из за этого?

 

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


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

if level.name() ~= "l07_military" then
         return
else

Судя по этому удаление будет происходить везде кроме l07_military

Так и задумывалось?

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

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


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

max_max_08,

кроме инфопрошней там может работать в диалоге precoginition функция - в общем диалог квеста в студию

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


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

а это не подойдет

C++ class CServerList : CUIWindow {

CServerList ();

 

function SetPlayerName(string);

function GetFont();

function SetWindowName(string);

function Enable(boolean);

function SetHeight(number);

function SetFilters(SServerFilters&);

function RefreshList(boolean);

function SetSortFunc(string, boolean);

function SetAutoDelete(boolean);

function NetRadioChanged(boolean);

function ShowServerInfo();

function RefreshQuick();

function AttachChild(CUIWindow*);

function GetWidth() const;

function SetWndPos(number, number);

function Init(number, number, number, number);

function Init(Frect*);

function ConnectToSelected();

function DetachChild(CUIWindow*);

function SetPPMode();

function WindowName();

function IsShown();

function SetWndSize(number, number);

function SetWndRect(Frect);

function SetWndRect(number, number, number, number);

function GetHeight() const;

function SetWidth(number);

function Show(boolean);

function IsEnabled();

function ResetPPMode();

function SetFont(CGameFont*);

function IsAutoDelete();

};

 

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


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

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