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

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

 
 

ian98 я  в папке с чекером создал папку отдельную, только туда кидаю скрипты для проверки


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

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


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

vader_33 снова лог со столом, он же вроде есть, или его нет? Или table в луа это вообще не стол?

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : .\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:30: attempt to call field 'change_rank2' (a table value)
 


76561198152189716.png

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


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

ian98 table - это таблица. Как щас файл выглядит?


Дополнено 0 минут спустя

ian98 и как функция в бинд сталкере выглядит


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

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


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

vader_33 

Спойлер

function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    if sobj and is_stalker(sobj) and sobj:alive() and sobj:rank()==0 then
      local is_tbl_npc = npc_tbl[ sobj:name() ] or npc_tbl[ sobj:profile_name() ]
      if is_tbl_npc then
		sobj:set_rank(upgrade_exp*lvl+math.random(1,1000))
			end
		end
	end
end

function is_stalker(sobj)
  return sobj:clsid() == clsid.script_stalker
end

 

таблица сверху есть одна npc_tbl

Я вот думаю, может она вообще не нужна? Таблица эта. Ну-ка уберу ее.

 

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

76561198152189716.png

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


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

ian98 вообще весь файл. В бинд сталкере как прописано?


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

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


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

ian98 а, блин, невнимательность. Функция называется change_rank_2(), а в биндере прописано change_rank2()

Изменено пользователем vader_33
  • Смех 1

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

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


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

vader_33 боги. я только сейчас увидел... Целый день копался в character_desc, выдавал там визуалы сюжетным нпс, с ума сойдешь...

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

76561198152189716.png

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


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

ian98 надо отдыхать)


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

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


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

vader_33 так хочется доделать уже, плюс все пробегать нужно, а там внезапно ВСЕГДА какие-то вылеты на пути. Их править, пока правишь еще что-то придумал, ввел, опять пробегать и снова вылеты, и так по кругу. Уже 7 круг.


76561198152189716.png

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


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

ian98 по невнимательности еще больше вылетов будет, лучше делать не спеша


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

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


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

vader_33 Да тут уже:D

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : .\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...w of chernobyl\gamedata\scripts\change_rank_2.script:263: attempt to perform arithmetic on global 'upgrade_exp' (a nil value)

Неправильно выдаю експу видно. Ага upgrade_exp это из xrs_armor скрипта

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

76561198152189716.png

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


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

ian98 upgrade_exp не назначено


Дополнено 2 минуты спустя

ian98 я ж говорю, отдыхать надо) Всё, я ушел, уже бежать надо

  • Смех 1

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

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


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

Проспался, а теперь не могу понять как выдать репутацию. set_character_reputation(number) и change_character_reputation(number) приводят к вылетам. И еще это условие как-то через одно место проверяется sobj:rank() == 0. 

Спойлер

function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    if sobj and is_stalker(sobj) then
      local is_tbl_npc = npc_tbl[ sobj:name() ] or npc_tbl[ sobj:profile_name() ]
      if is_tbl_npc then
		sobj:set_rank(math.random(1,1000))
		sobj:set_character_reputation(math.random(-5000,5000))
			end
		end
	end
end

 

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

Сейчас я вроде понял почему не работало sobj:rank() == 0. Ну, я понял, что оно не в той строчке не так вставлено, но я не знаю как вставить так.

Пробовал так

Спойлер

-- всех комментариев нет в скрипте.
function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    if sobj:rank() >= 1 then return end -- что-то вроде проверки, если ранг выше или равняется 1, то аборт
    if sobj:rank() == 0 then -- если ранг 0, то 
    if sobj and is_stalker(sobj) then -- если сталкер
		sobj:set_rank(math.random(1,1000)) -- выдаем ранг, как выдавать еще и репутацию я так и не понял
			end
		end
	end
end

function is_stalker(sobj)
  return sobj:clsid() == clsid.script_stalker
end

 

Спойлер

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : .\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...w of chernobyl\gamedata\scripts\change_rank_2.script:6: attempt to call method 'rank' (a nil value)
 

stack trace:

Я думаю ошибка какая-то простая, ранга этого нет, но как сделать чтобы он был. Я не понимаю. Это должно быть как local rank = что-то там? А уже потом все это?

Что-то типо такого

Спойлер

function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    local rank = ranks.get_obj_rank_name(npc) -- нашел такую строчку в одном из скриптов. Она неправильная, но как пример, что ранк нужно обозначить сперва.
    if rank() >= 1 then return end
    if rank() == 0 then
    if sobj and is_stalker(sobj) then
		sobj:set_rank(math.random(1,1000))
			end
		end
	end
end

function is_stalker(sobj)
  return sobj:clsid() == clsid.script_stalker
end

 

 

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

76561198152189716.png

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


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

set_character_reputation(number) и change_character_reputation(number) приводят к вылетам

просил же лог прикладывать

9 часов назад, ian98 сказал:

И еще это условие как-то через одно место проверяется sobj:rank() == 0. 

в чем именно там ошибка проверки? Сверяли ранг всех нпс до изменения и после изменения? Перебрал всех нпс и вывел в лог ранги - ни у кого 0 не было, в основном больше 100

9 часов назад, ian98 сказал:

local rank = что-то там?

это уже есть, sobj:rank(). А вылет из-за того, что сначала должно идти условие if sobj..., чтобы потом sobj:rank() применялось к точно существующему объекту в игре. При переборе просто подставляются числа от 1 до 65534, не обязательно alife():object(a) при этом будет существовать в  игре

 


Дополнено 10 минуты спустя
9 часов назад, ian98 сказал:

set_character_reputation(number) и change_character_reputation(number) приводят к вылетам

может вылет происходит из-за того, что нпс не успевают выйти в онлайн. Если в луа_хелп метод находится только в C++ class game_object - значит, он только для онлайнового объекта

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

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

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


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

в чем именно там ошибка проверки? Сверяли ранг всех нпс до изменения и после изменения? Перебрал всех нпс и вывел в лог ранги - ни у кого 0 не было, в основном больше 100

 

sobj:rank() == 0 then

Если вставляю в скрипт, то персонажи с 0 рангом не получают ранг, а все остальные получают. А как можно сделать так, чтобы наоборот персонажи с нулевым получали, а все остальные нет? Неужели просто поставить 1? В общем, нет, странно все это.

Вот, мой скрипт, уже в который раз:

Спойлер

function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    if sobj and is_stalker(sobj) and sobj:rank() == 0 then
		sobj:set_rank(math.random(1,2000))
		end
	end
end

function is_stalker(sobj)
  return sobj:clsid() == clsid.script_stalker
end

 

Вот профиль волка

Спойлер

		<icon>ui_npc_u_stalker_neytral_balon_1</icon>
		<bio>esc_wolf_bio</bio>
<name>esc_wolf_name</name>
<rank>0</rank>
<class>esc_wolf</class>
<crouch_type>-1</crouch_type>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
		
		<reputation>5</reputation>
		<money min="600" max="2000" infinitive="0"/>
		
		<snd_config>characters_voice\human_01\stalker\</snd_config>
 
		<visual>actors\trader\trader</visual>

 

А вот, что в игре

Спойлер

?imw=5000&imh=5000&ima=fit&impolicy=Lett

Спойлер

?imw=5000&imh=5000&ima=fit&impolicy=Lett

Да, у волка еще есть 105 профилей, все сделаны по шаблону

Спойлер

    <specific_character id="esc_wolf_1" team_default = "1">
#include "gameplay\random_visual\1.xml"
<name>esc_wolf_name</name>
<rank>0</rank>
<class>esc_wolf</class>
<crouch_type>-1</crouch_type>
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
        <supplies>
#include "gameplay\weapons\test.xml"
#include "gameplay\loot\loot.xml"
        </supplies>
#include "gameplay\character_no_criticals.xml"
#include "gameplay\dialogs\wolf.xml"
    </specific_character>

А каждый конфиг в gamedata/random_visual выглядит вот так. Вот прям каждый. Проверено тотал коммандером(имеется ввиду <rank>0</rank> или его отсутствие вообще)

Спойлер

        <icon>ui_npc_u_barman</icon>
        <map_icon x="1" y="4"></map_icon>
        <bio>bar_barmen_bio</bio>

        <money min="100000" max="110000" infinitive="1"></money>
        <reputation>50</reputation>
        <visual>actors\stalker_zombi\zombie_fresh_1</visual>
        <snd_config>characters_voice\human_01\stalker\</snd_config>

или я уже отчаялся и делал так

Спойлер

        <icon>ui_npc_u_stalker_neytral_balon_1</icon>
        <bio>esc_wolf_bio</bio>
        
        <reputation>5</reputation>
        <money min="600" max="2000" infinitive="0"/>
        <rank>0</rank>
        <snd_config>characters_voice\human_01\stalker\</snd_config>
 
        <visual>actors\neytral\stalker_neytral_balon_1</visual>

Это я к тому, что ранг Волка, ну, полюбому нулевой, а скрипт его игнорит... И если убрать проверку, только тогда Волк вместе со всеми начинает получать свой ранк. Только скрипт на нетспавне висит и каждый раз ранк роллит по новой, что прикольно, но ломает xrs_armor, который я все же решил не отключать и раздавать им визуалы несюжетным персам. Так и сижу, голову ломаю. Что делаю не так.. Можно ли вырезать выдачу ранга в xrs_armor, но оставить выдачу визуала?  Там скрипт большой, пытался удалить строки за это отвечающие пару раз, но в итоге ломал н?*)ен весь скрипт целиком.

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

76561198152189716.png

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


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

Можно ли вырезать выдачу ранга в xrs_armor, но оставить выдачу визуала?

а, так это из-за выдачи ранга в xrs_armor все получают ранг. Я-то думаю, что такое, у меня с условием "if sobj and is_stalker(sobj) and sobj:alive() and sobj:rank()==0 then" вообще никто ничего не получает, мистика. Вечером гляну xrs_armor


Дополнено 3 минуты спустя

ian98 он остался как в этом сообщении или менялся? 

 


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

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


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

vader_33 Да, xrs_armor дает ранг, но, уточню на всякий, скриншоты которые скидывал я сделаны с отключенным xrs_armor. А вообще, если оставить xrs_armor и скрипт на выдачу ранга, то xrs_armor кое-как выдает скины(выдает далеко не всем, а только персонажам с высоким рангом, только они переодеваются, хотя броники для переодевания у всех прописаны со 100 шансом. НО, уже переодетые нпс при перезагрузке могут своего визуала лишиться, я думаю это уже связано со вторым скриптом на выдачу ранга.)

Спойлер

function change_rank_2()
  for a = 1, 65534, 1 do
    local sobj = alife():object(a)
    if sobj and is_stalker(sobj) then
		sobj:set_rank(math.random(1,2000))
		end
	end
end

function is_stalker(sobj)
  return sobj:clsid() == clsid.script_stalker
end

 

 


Дополнено 2 минуты спустя

vader_33 остался таким же. Я могу вообще всю геймдату дать, заодно и оценишь свой вклад, да и проще будет. Она 400 мб весит. Мод, на мой скромный вкус, получается действительно весьма потешный в самом хорошем смысле.


Дополнено 3 минуты спустя

xrs_armor.script а могу просто оставить, на всякий. Все-таки там были изменения, хоть и незначительные.

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

76561198152189716.png

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


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

ian98 пока не ушел, быстренько раздал новичкам в деревне экзы - как был ранг новичок, так и остался. xrs_armor.script редактировал оригинальный, копировать 100 визуалов - ну такое) change_rank2.script тоже скидываю, с которым проверял, ни у одного ранга 1000 нету. Только для теста в xrs_armor.script закомментил 607 строчку, чтобы нпс сразу переодевались. У меня всё работает, как задумано, нпс с рангом не 0 не меняют ранг ни при переодевании ни при загрузке, если с этими файлами все равно будут менять ранг - я уже не знаю, в чем тут дело

change_rank2.script xrs_armor.7z

  • Спасибо 1

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

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


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

vader_33 Я даю 105 визуалов) Только тем у кого проблемы с xrs_armor и они выходят калеками из оффлайна. Хотя, возможно, потихоньку действительно раздам каждому нпс в игре по 105 визуалов+несюжетные будут получать по визуалу сверху+ранг динамический, еще бы репутацию динамическую ко всему прочему. Дело нехитрое, просто долгое и нудное.


Дополнено 32 минуты спустя

vader_33 не знаю, а что должно было произойти? Со своим xrs_armor, но с комментарием строчки

			--if dist_to_actor>1 or dist_to_actor>150 then

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

Попробовал потом свой xsr_armor выключить, полностью взяв два файла твоих. Вижу визуалы у всех экзоскелетные и ранги новички. Я могу и так обыграть, прикольно. Это я могу 200 мб расплодившихся визуалов по своиму какому-то косяку явно удалять теперь и без смены ранга менять один раз и навсегда визуал через костюм. Всего 1 строчка? Ну, кстати, по-моему там две строчки. Я еще увидел -- end. Нет, вообще большое спасибо, у меня явно были какие-то проблемы в скриптах. Теперь их точно меньше.

А вот там таймер стоит аж на 10 секунд, так ли он нужен?

Возвращаясь к 100+ визуалам, можно ли тогда это сделать скриптом? 

Речь об этой строчке из профиля каждого нпс в игре 

        <icon x="20" y="10"></icon> - можно ли выдавать скриптом это? 

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

76561198152189716.png

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


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

ian98 строчка с условием закоменчена для теста, чтобы сразу переодевались. С условием будут переодеваться когда актор не видит нпс и отошёл от них. Она не влияет ни на что, просто красивее смотрится, чем исчезающий и проявляющиеся нпс. А ранг менялся той же функцией сет ранк, её закомментил. 

Я щас не могу посмотреть, что там за таймер, вечером гляну


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

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


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

vader_33 таймер на срабатывания переодевания(уход в оффлайн/онлайн). Их там два. Один на +11000, второй на +8500.

 

Я поставил на +1000, +500 - скрипт практически сразу срабатывает и избавляет игрока от случайного вылета с логом 

stack trace:

0023:004D8F60 XR_3DA.exe, CTheoraSurface::`vftable'()
 
[error][     126]    : Не найден указанный модуль.

или

stack trace:

0023:004D8F60 XR_3DA.exe, CTheoraSurface::`vftable'()

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

Еще попытался снова выдать репутацию. Сменил немного скрипт согласно рекомендациям. 

Сейчас он выглядит так, но не работает. Но и не вылетает, что тоже неплохо. 

Спойлер

function change_rep_2()
	for k, v in pairs (db.storage) do
		local obj = level.object_by_id(k)
			if sobj and is_stalker(sobj) then
				local is_tbl_npc = npc_tbl[ sobj:name() ] or npc_tbl[ sobj:profile_name() ]
					if is_tbl_npc then
						--_dbg.log1("до set rank: npc = %s, rank = %s", sobj:name(), sobj:rank())
				sobj:set_character_reputation(-5000)
						--_dbg.log1(" после set rank: npc = %s, rank = %s", sobj:name(), sobj:rank())
					end
			end
	end
end

 

dbg log может и убрать можно бы было, но я боюсь трогать скрипты. Они об меня ломаются.

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

76561198152189716.png

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


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

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


Дополнено 7 минуты спустя

ian98 насчёт изменения иконки, надо  смотреть скрипт изменения нет-пакета, меняется ли она


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

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


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

del

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

 

Спойлер

Screenshot-20241118-181546-com-android-c

 

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


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

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

хм, у меня не вылетает


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

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


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

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

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

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

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

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

Войти

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

Войти

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