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

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

abramcumner, да это вот только что тоже заметил, но ещё увидел, что одно обращение всё таки есть:

function lstats()

local can_spawn = {}

printf("***************** LIMITS STATISTIC *********************")

for k,v in pairs(respawners) do

-- Запоминаем максимальное количество весов для данного респавнера

local wage = 0

for kk,vv in pairs(v.respawn_section) do

wage = wage + vv.prob

end

 

-- Заносим максимальное количество всех типов чуваков, которые данный респавнер может наспаунить.

for kk,vv in pairs(v.respawn_section) do

local tt = v.sectSpawnProps[vv.section]

local community_rank = tt.community.."_"..tt.rank

if can_spawn[community_rank] == nil then

can_spawn[community_rank] = {community = tt.community, rank = tt.rank}

end

end

end

-- Выводим все это в общей статистике

local total_max, total_prob, total_current, total_limit = 0,0,0,0

for k,v in pairs(can_spawn) do

local cs = sim_statistic.simNpcCount(v.community, v.rank)

local gl = simMaxCount[k]

if gl == nil then gl = 0 end

 

total_current = total_current + cs

total_limit = total_limit + gl

 

printf("%s current=%s limit=%s", k, cs, gl)

end

printf("TOTAL: current=%s limit=%s", total_current, total_limit)

end

 

Это не оно? Если всё таки это не сработает, то каким способом можно уменьшить?

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

Всем привет, кто-нибудь знает как выглядит скрипт по ограблению ГГ т.е. каким образом можно удалить всё из инвентаря, и забрать у ГГ все деньги? Речь идет о ЗП. Зарание спасибо.

 

Добавлено через 7 мин.:

strelok200, вот есть такая функция. Один её недостаток достаточно сильно тормозит игру вовремя выполнения(это где-то секунда), но зато позволяет удалить не только НПС но и другие объекты, не по сиду, а просто по названию самого объекта.

 

function delete_stalker_bandit_cutscena_zasada_bandit()

for a=10,65635,1 do

local obj=alife():object(a)

if obj and string.find(obj:name(),"marsh_b8_bandit_cutscene_bandit_zasada1") then

alife():release(obj,true)

end

end

 

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

speczadanie

    --Stop
self.button_stop_1 = xml:Init3tButton    ("button_stop",    self)
self:Register            (self.button_stop_1, "button_stop")
self.button_stop_1:SetWndPos(vector2():set(438,475))

Я использовал такой метод

 

Ссылка на комментарий
Всем привет, кто-нибудь знает как выглядит скрипт по ограблению ГГ т.е. каким образом можно удалить всё из инвентаря, и забрать у ГГ все деньги? Речь идет о ЗП. Зарание спасибо.

Удалить все вещи из инвентаря ГГ легко, но очень часто требуется скинуть их в тайник, откуда они потом могут опять попасть к ГГ. Вот функция которую написал я:

function actor_look_at_sitnik_hit_to_actor_2()
    local cbox = level.object_by_id(alife():story_object(2026).id)      --получаем тайник около Борова по sid
    db.actor:inventory_for_each(
    function (item, actor)
    local section = item:section()
    if section == "hand_radio_f"
    or section == "device_pda"
    or section == "device_torch"
    or section == "separator"
    or section == "mobile_changer"
    or section == "bolt" then                          --Сюда пишем исключения
        return
    end
    
    if system_ini():line_exist(section, "quest_item") then      --не удаляем квестовые предметы
        if system_ini():r_bool(section, "quest_item") then
            return
        end
    end
    db.actor:transfer_item(item,cbox)     --перемещаем
end, db.actor)
end

 

 

Кстати в твоей функции есть небольшая ошибка - ты начинаешь переберать с 10 объекта, а вдруг нам не повезло и наш НПС получил id 7?

Я использую 3 варианта:

Варианты:

function delete()
   for a=10,65635,1 do
      local obj=alife():object(a)
      if obj then
         if string.find(obj:name(),"name") then
            alife():release(obj,true)
         end
      end
   end
end

 

 

Если вы уверены что НПС в онлайне

function delete()
   for k,v in pairs(db.storage) do
      local obj = level.object_by_id(k)
      if obj then
         if string.find(obj:name(),"aaaa") then
            alife():release(alife():object(k),true)
         end
      end
   end
end

 

 

Как вариант можно при спавне запомнить id НПС

local obj = alife():create(......
amk.save_variable("my_obj_id",obj.id)
....
local sobj = alife():object(amk.load_variable("my_obj_id"))
if sobj then
   alife():release(,true)
end

 

Изменено пользователем _Призрак_

Freedom

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

А что значит эта строка?

for a=10,65635,1 do

 

По названию, то есть по секции?

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

Создаю глобальный мод с новыми локациямЭ

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

speczadanie

> local can_upgrade_table = {"stalker_outfit", "wpn_ak74"}

> Как скриптом, находящимся в этом же файле, проверить: равно ли значение переменной "NUM" хотя бы одному из значений таблицы?

 

Лучше переделай так:

local can_upgrade_table = {

stalker_outfit = true,

wpn_ak74 = true,

}

 

Тогда для проверки достаточно будет написать

if can_upgrade_table[num] then

-- предмет есть в таблице --

else

-- нет в таблице --

end

 

> мы можем изменить ширину кнопки. А как по аналогии изменить координату X ?

Width это ширина, как раз x, а Height это высота - y

 

И да, откопай в папке scripts фаил LuaHelp.script

 

Там описаны все доступные функции для таких объектов, например ты создал кнопку, ищешь в файле её клас:

C++ class CUI3tButton : CUIButton {

CUI3tButton ();

 

И вуаля: function SetHeight(number);

 

 

 

Ulman

На офф. форуме GSC в разделе Моды ТЧ как то kstn выкладывал мод кажется Respawn Fix, соль была в том, что он как раз правил респавнеры и смарты, и по моему как раз возвращал это значение в рабочее состоянее. Я не знаю, вроде он и на АМК тему создавал. М.б ты найдёшь там чо.

 

А вообще стек может переполнится даже от 1 НПС, если в скрипте так сложится обстоятельства. Да и вообще уменьшение людей, это тоже не выход (если конечно игра у тебя не тормозит от них). Какой то скрипт просто тяжёлый для игры или с не доделками. Возможно это AI Additional (если такой есть у тебя) но не факт что он или только он.

 

strelok200

> А что значит эта строка?

> for a=10,65635,1 do

 

Любой объект в сталкере при спавне получает свой уникальный (на текущий момент) игровой идентификатор - ID

Всего в игре может быть до 65635 объектов. (на всех уровнях)

 

В данном случае механизм работает так - игра перебирает все 65635 объектов (ну не всех конечно, она смотрит сперва, существует ли такой объект в игре вообще, т.к реально их ГОРАЗДО меньше) и если существует, смотрит какие то определённые свойства этого объекта, и если они подходят к чему то, то выполняет какое то действие. Какое действие и какое условие проверки - это уже ты сам решаешь.

 

И да. начинать надо не с 10 а с 1. (иначе первые 10 объектов не будут учтены)

И можно короче написать: for a=1, 65635 do

 

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
_Призрак_, в принципи для ЗП и этого хватает(т.к. там именной сид), ещё ни разу эта функция не подводила, но за замечание спасибо учту. Изменено пользователем Якут
Ссылка на комментарий
*Shoker*: можно короче написать: for a=1, 65635 do

Можно, но правильно писать для итерации по всем объектам в игре так: for a=0, 65634 do

 

Следует не просто зазубривать числа, но и понимать их значение.

Немного теории:

Игровые идентификаторы (ID) выдаются из диапазона 0 ... 65534, сохраняются в u16 (это 2 байта).

0-ой идентификатор получает объект актора (ГГ), т.к. именно он спавнится первым в игре.

65534 - последний из возможных идентификаторов для объектов в игре.

65535 - это уже несуществующий идентификатор и служит признаком НЕпринадлежности какому-либо объекту.

Т.о. при поиске объектов в циклах итерации можно применять запись: for a=1, 65634, которая охватывает все возможные объекты кроме актора.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Ну игра не тормозит, но просто это закономерность, вылеты с переполнением стека, только на Баре и там как раз людей, многовато лазит, по крайней мере учитывая малые размеры локации, в алайфе находится уж очень много НПС.

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

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

- слабенький комп с ограниченным объемом ОЗУ

- 'грязный'/неоптимизированный код (от мододелов).

 

Первая причина встречается уже довольно редко и 'лечится' просто: нужен игровой комп, а не 'печатающая машинка'.

Вторая причина встречается гораздо чаще и лечится гораздо сложнее ...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Artos, скорее всего проблема первая, так как комп у меня то хороший, но вот ОЗУ маловато, 2 планки по 2гб сгорели и вот сижу пока довольствуюсь одной на 2гб. А со вторым, ну АИ схемы нормально оптимизированы, я говорю про АИ пак 3в1?
Ссылка на комментарий

strelok200

Покажи её всю.

 

Ulman

Ты шо, от твоих 2 гб там ещё и останется :D

Это точно второй случаи. У меня такое на ЧН бывало. Артос правильно сказал, что то криво работает у тебя. Каких то советов сложно дать, но почти наверняка это что то связано со скриптовыми схемами, поэтому когда много НПС, начинаются глюки. У тебя есть Ai Additional? Попробуй его убрать пока. Мне кажется, он грешит этим. Но не факт.

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
abramcumner, да это вот только что тоже заметил, но ещё увидел, что одно обращение всё таки есть:

        local gl = simMaxCount[k]

Это не оно? Если всё таки это не сработает, то каким способом можно уменьшить?

Нет, даже по названию это функция для сбора статистики, на население никакого влияния не оказывает.

Уменьшить можно только поставив скрипт для редкого респавна. В той же солянке он есть. В нем se_respawn.script как раз и правится.

 

Ну или уменьшив население и количество гулагов :)

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

Ребят, помогите пожалуйста. В сталкере ЗП можно чем-нибудь заменить функцию SetOriginalRect? Ее же вырезали из ЗП, верно?

Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

Как можно округлить число до сотен (не обрезать, а округлить)?

Например, было "632.565", стало "600"; было "2799", стало "2800".

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

*Shoker*, function dell_kluk_final()

for a=10,65635,1 do

local obj=alife():object(a)

if obj and string.find(obj:name(),"otm") then

alife():release(obj,true)

end

end

Создаю глобальный мод с новыми локациямЭ

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

И ещё вопрос в дополнение к предыдущему:

Заспавнил оружие с помощью "amk.spawn_item_in_inv("wpn_ak74")", как можно сразу после этого установить состояние для только что созданного объекта? Точнее, как определить этот объект, чтобы затем применить к нему ":set_condition()"?

 

local wpn = amk.spawn_item_in_inv("wpn_ak74")
wpn:set_condition(1)

ColR_iT

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

ColR_iT

Не правильно

метод set_condition(number) работает только для game_object* (т.е. для клиентских объектов), а функция amk.spawn_item_in_inv работает на функции alife():create которая возвращает серверный объект.

Тут есть пара вариантов, но самый красивый из них таков:

function spawn()
local wpn = amk.spawn_item_in_inv("wpn_ak74")
level.client_spawn_manager():add( wpn.id, 0, weapon_in_alife)    --ставим каллбек на выход в онлайн
end

function weapon_in_alife(first,id,obj)
obj:set_condition(0)     --выставляем кондишн
level.client_spawn_manager():remove(id, 0) -- убраем установленный колбек
end

Freedom

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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