Скрипты - Страница 157 - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Картостроительство (Редактор карт) В этом разделе можно обсуждать все что касается редактора карт для Heroes of Might and Magic V. Так же здесь обсуждаем картостроительство.

Ответ
Страница 157 из 260
 
Опции темы
#2341
Старый 26.07.2017, 13:38
  #2341
^
KioM
 
Аватар для KioM
📖
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
По умолчанию
Re: Скрипты

вопрос к опытным скриптерам:
как лучше всего (минимальным кол-вом кода) сделать обработчик посещенности строения по типу склепа например, мои идеи ограничиваются способом - через включение/выключение проверочной константы в триггере нового дня с нужными мне условиями. Но может есть способ по эффективнее?)
KioM вне форума
Ответить с цитированием
#2342
Старый 26.07.2017, 20:03
  #2342
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты

KioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.
Jack_of_shadows вне форума
Ответить с цитированием
#2343
Старый 26.07.2017, 21:24
  #2343
^
KioM
 
Аватар для KioM
📖
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
По умолчанию
Re: Скрипты

Jack_of_shadowsKioM, опишите лучше подробнее что нужно, а то я так понимаю, что "обработчик посещенности строения" это функция, которая срабатывает при посещении строения. В таком случае непонятно в чем загвоздка, если есть триггер касания объекта.

почти) нужно: есть храм (свой собственный) при активации идет скрипт, бой и т.д. затем хочу сделать так, чтобы при посещении его скажем последующие несколько дней, до начала новой недели выдавало сообщение и отказ (это тоже все понятно) но проверку на то посещено оно уже каким-то игроком или несколькими или нет как лучше сделать? идея была через указатель состояния в функции нового дня через триггер, но может есть более простая и универсальная фича для подобных дел? для подобных строений, которая передавала бы информацию, что его уже разграбили
KioM вне форума
Ответить с цитированием
#2344
Старый 26.07.2017, 21:48
  #2344
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
Регистрация: 08.09.2013
Сообщения: 507
Выставка наград
По умолчанию
Re: Скрипты

Чуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной. Если поведение одинаково для всех игроков, переменная одна, если разная для каждого игрока - таблица переменных.
Если же нужно как-то внешне показывать на объекте, разграблен он или уже обновился, тогда конечно только через триггер нового дня, иных способов нет.
Jack_of_shadows вне форума
Ответить с цитированием
#2345
Старый 26.07.2017, 22:49
  #2345
^
KioM
 
Аватар для KioM
📖
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
Регистрация: 01.02.2012
Адрес: Херсон, Украина
Сообщения: 351
Выставка наград
По умолчанию
Re: Скрипты

Jack_of_shadowsЧуть проще во время активации сохранять в переменную текущую дату, и при касании объекта сверять дату с этой переменной.
Спасибо, то что нужно
KioM вне форума
Ответить с цитированием
#2346
Старый 28.07.2017, 22:00
  #2346
^
Dyrman
 
Аватар для Dyrman
📖
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
По умолчанию
Re: Модостроительство

Имеется код:
	local NHF_Trigger_env = {trig = {}}
print("T1:");
NHF_Trigger_env.Trigger = Trigger
function NHF_Trigger_env.tostring(a)
	return a and (a.."" ~= a and a or '"'..a..'"') or "nil"
end;
function NHF_Trigger_env.emptytable(t)
	print("T2:");
	for k,v in t do
		if v then return nil end
	end
	return 1
end;
function NHF_Trigger_env.hasparam(i)
	print("T3:");
	return i ~= 0 and i ~= 10 and i ~= 11
end;
function __HANDLER(trigtype, param)
	print("T4:");
	print("T5:");
	local h = %NHF_Trigger_env.trig[trigtype]
	if not h then return end
	local NHF_Trigger_env = %NHF_Trigger_env
	return function(a, b, c, d)
		a = %NHF_Trigger_env.tostring(a)
		b = %NHF_Trigger_env.tostring(b)
		c = %NHF_Trigger_env.tostring(c)
		d = %NHF_Trigger_env.tostring(d)
		local args = "(" .. a .. "," .. b .. "," .. c .. "," .. d .. ")"
		print("T6:");
		for sender, tab in %h do
			if sender ~= 0 then
				local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
				if handler then
					startThread(parse(handler .. args))
				end
			end
		end		
		local tab = %h[0]
		print("T7:");
		if tab then
			local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
			if handler then
				print("T8:");
				startThread(parse(handler .. args))
			end
		end
	end
end;
function Trigger(sender, trig, par, handler)
	print("T9:");
	if sender .. "" ~= sender then
		print("T10:");
		sender, trig, par, handler = 0, sender, trig, par
	end
	if not %NHF_Trigger_env.hasparam(trig) then
		print("T11:");
		par, handler = nil, par
	end
	local need_disable = handler ~= nil
	if handler then
		print("T12:");
		%NHF_Trigger_env.trig[trig] = %NHF_Trigger_env.trig[trig] or {}
		if par then
			print("T13:");
			%NHF_Trigger_env.trig[trig][sender] = %NHF_Trigger_env.trig[trig][sender] or {}
			%NHF_Trigger_env.trig[trig][sender][par] = handler
		else
			print("T14:");
			%NHF_Trigger_env.trig[trig][sender] = handler
		end
	else
		print("T15:");
		if %NHF_Trigger_env.trig[trig] then
			if %NHF_Trigger_env.trig[trig][sender] then
				if par then
				print("T16:");
					%NHF_Trigger_env.trig[trig][sender][par] = nil
					need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig][sender])
					if need_disable then %NHF_Trigger_env.trig[trig][sender] = nil end
				else
					%NHF_Trigger_env.trig[trig][sender] = nil
				end
				need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig])
				if need_disable then %NHF_Trigger_env.trig[trig] = nil end
			end
		end
	end
	if not need_disable then return end
	if par then
		print("T17:");
		%NHF_Trigger_env.Trigger(trig, par, handler and "__HANDLER(" .. trig .. "," .. %NHF_Trigger_env.tostring(par) .. ")")
	else
		%NHF_Trigger_env.Trigger(trig, handler and "__HANDLER(" .. trig .. ")")
	end
	print("T18:end");
end;


Выдаёт ошибку:
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 20
Размер:	33.8 Кбайт
ID:	50081

Есть ли предположения, что тут не так?
Dyrman вне форума
Ответить с цитированием
#2347
Старый 28.07.2017, 22:33
  #2347
^
AstralLein
 
Аватар для AstralLein
📖
Регистрация: 02.06.2017
Адрес: В Империи Незанхельм.
Сообщения: 3900
Регистрация: 02.06.2017
Адрес: В Империи Незанхельм.
Сообщения: 3900
По умолчанию
Re: Скрипты

Нифига себе скрипт... мне бы так уметь. Извиняюсь не в тему.
__________________
Ох это сладостное, поглощающее разум безумие! 

Готовые проекты:


Карты для героев 5:
"Плата за любовь"
"Путь некроманта"
"Темные грани"

Карты для Disciples 3:
"Противостояние"

Проекты в разработке:

Моды для Disciples 3:
"Астельнаир" - разработка возобновлена в мае 2019 год

Карты для героев 5:
"Рок Гримхейма" - в активной разработке
Ох это сладостное, поглощающее разум безумие! 

Готовые проекты:


Карты для героев 5:
"Плата за любовь"
"Путь некроманта"
"Темные грани"

Карты для Disciples 3:
"Противостояние"

Проекты в разработке:

Моды для Disciples 3:
"Астельнаир" - разработка возобновлена в мае 2019 год

Карты для героев 5:
"Рок Гримхейма" - в активной разработке
AstralLein вне форума
Ответить с цитированием
#2348
Старый 28.07.2017, 22:46
  #2348
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Модостроительство

DyrmanИмеется код:
	local NHF_Trigger_env = {trig = {}}
print("T1:");
NHF_Trigger_env.Trigger = Trigger
function NHF_Trigger_env.tostring(a)
	return a and (a.."" ~= a and a or '"'..a..'"') or "nil"
end;
function NHF_Trigger_env.emptytable(t)
	print("T2:");
	for k,v in t do
		if v then return nil end
	end
	return 1
end;
function NHF_Trigger_env.hasparam(i)
	print("T3:");
	return i ~= 0 and i ~= 10 and i ~= 11
end;
function __HANDLER(trigtype, param)
	print("T4:");
	print("T5:");
	local h = %NHF_Trigger_env.trig[trigtype]
	if not h then return end
	local NHF_Trigger_env = %NHF_Trigger_env
	return function(a, b, c, d)
		a = %NHF_Trigger_env.tostring(a)
		b = %NHF_Trigger_env.tostring(b)
		c = %NHF_Trigger_env.tostring(c)
		d = %NHF_Trigger_env.tostring(d)
		local args = "(" .. a .. "," .. b .. "," .. c .. "," .. d .. ")"
		print("T6:");
		for sender, tab in %h do
			if sender ~= 0 then
				local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
				if handler then
					startThread(parse(handler .. args))
				end
			end
		end		
		local tab = %h[0]
		print("T7:");
		if tab then
			local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab
			if handler then
				print("T8:");
				startThread(parse(handler .. args))
			end
		end
	end
end;
function Trigger(sender, trig, par, handler)
	print("T9:");
	if sender .. "" ~= sender then
		print("T10:");
		sender, trig, par, handler = 0, sender, trig, par
	end
	if not %NHF_Trigger_env.hasparam(trig) then
		print("T11:");
		par, handler = nil, par
	end
	local need_disable = handler ~= nil
	if handler then
		print("T12:");
		%NHF_Trigger_env.trig[trig] = %NHF_Trigger_env.trig[trig] or {}
		if par then
			print("T13:");
			%NHF_Trigger_env.trig[trig][sender] = %NHF_Trigger_env.trig[trig][sender] or {}
			%NHF_Trigger_env.trig[trig][sender][par] = handler
		else
			print("T14:");
			%NHF_Trigger_env.trig[trig][sender] = handler
		end
	else
		print("T15:");
		if %NHF_Trigger_env.trig[trig] then
			if %NHF_Trigger_env.trig[trig][sender] then
				if par then
				print("T16:");
					%NHF_Trigger_env.trig[trig][sender][par] = nil
					need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig][sender])
					if need_disable then %NHF_Trigger_env.trig[trig][sender] = nil end
				else
					%NHF_Trigger_env.trig[trig][sender] = nil
				end
				need_disable = %NHF_Trigger_env.emptytable(%NHF_Trigger_env.trig[trig])
				if need_disable then %NHF_Trigger_env.trig[trig] = nil end
			end
		end
	end
	if not need_disable then return end
	if par then
		print("T17:");
		%NHF_Trigger_env.Trigger(trig, par, handler and "__HANDLER(" .. trig .. "," .. %NHF_Trigger_env.tostring(par) .. ")")
	else
		%NHF_Trigger_env.Trigger(trig, handler and "__HANDLER(" .. trig .. ")")
	end
	print("T18:end");
end;


Выдаёт ошибку:
Вложение 50081

Есть ли предположения, что тут не так?
С какими параметрами был вызван переопределенный Trigger?
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#2349
Старый 28.07.2017, 23:33
  #2349
^
Dyrman
 
Аватар для Dyrman
📖
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
По умолчанию
Re: Модостроительство

RedHeavenHeroС какими параметрами был вызван переопределенный Trigger?

Тип: OBJECT_TOUCH_TRIGGER
Проверка на существование героя и монстра стоит.

	function __HANDLER(trigtype, param)
	print("T4:"..trigtype);
	print("T5:"..param);
Нажмите на изображение для увеличения
Название: Безымянный.jpg
Просмотров: 22
Размер:	254.0 Кбайт
ID:	50083

С вызовами каждого триггера в отдельном потоке и нужными слипами в зависимости, мультиплеер карта или нет, можно заставить работать и в мульте. По крайней мере, часть триггеров хоть как-то работает.
Dyrman вне форума
Ответить с цитированием
#2350
Старый 29.07.2017, 00:08
  #2350
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Модостроительство

DyrmanТип: OBJECT_TOUCH_TRIGGER
Проверка на существование героя и монстра стоит.

	function __HANDLER(trigtype, param)
	print("T4:"..trigtype);
	print("T5:"..param);
Вложение 50083

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

	
local handler = %NHF_Trigger_env.hasparam(%trigtype) and tab and tab[%param] or tab


на

	
local handler
if %NHF_Trigger_env.hasparam(%trigtype) then
	handler = tab and tab[%param]
else
	handler = tab
end


в обоих случаях.
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#2351
Старый 29.07.2017, 00:14
  #2351
^
Dyrman
 
Аватар для Dyrman
📖
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
По умолчанию
Re: Скрипты

Ошибка исчезла.
Надо проверять на карте, где несколько триггеров теперь.
Dyrman вне форума
Ответить с цитированием
#2352
Старый 29.07.2017, 01:07
  #2352
^
Dyrman
 
Аватар для Dyrman
📖
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
По умолчанию
Re: Скрипты

К сожалению, триггер из карты не отрабатывается при наличии более позднего триггера.
Dyrman вне форума
Ответить с цитированием
#2353
Старый 29.07.2017, 01:25
  #2353
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Скрипты

Обозначен ли отправитель триггера, как другой?
То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя.
Например,
Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")

Добавлено через 2 минуты
Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
#2354
Старый 29.07.2017, 11:41
  #2354
^
Dyrman
 
Аватар для Dyrman
📖
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
Регистрация: 24.06.2008
Адрес: Там, где неба кончается край
Сообщения: 3479
Отправить сообщение для  Dyrman с помощью ICQ
По умолчанию
Re: Скрипты

RedHeavenHeroОбозначен ли отправитель триггера, как другой?
То есть в моде все триггеры должны иметь дополнительный первый параметр - отправителя.
Например,
Trigger("NHF", OBJECT_TOUCH_TRIGGER, "mob", "handler_function")

Добавлено через 2 минуты
Каждый уникальный отправитель может иметь свой триггер на данный тип события и параметр (объект, игрока, ...)
Да, и так, и так пробовал. Результат - одинаков.
Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...


Ещё вопрос стоит обнуления триггера, чтобы обнулялся только нужный, так будет правильно:
Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);?
А если в самой карте обнуляется Trigger( OBJECT_TOUCH_TRIGGER, mob, nil); , то не на все ли подействует?

Как понимаю, если первый параметр = nil, это тоже является уникальным параметром отправителя.


Выясняю задержки и потоки, может, они влияют, потому что в коде все правильно.
Dyrman вне форума
Ответить с цитированием
#2355
Старый 29.07.2017, 20:09
  #2355
^
RedHeavenHero
 
Аватар для RedHeavenHero
📖
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
Регистрация: 10.02.2012
Сообщения: 2378
Выставка наград
По умолчанию
Re: Скрипты

DyrmanДа, и так, и так пробовал. Результат - одинаков.
Если в самой карте переопределяешь триггер - то всё работает. С другим параметром отправителя. Но скрипты же готовых карт не будешь переделывать...
Важно, чтобы переопределение Trigger происходило до выполнения скрипта карты и скрипта мода.
Также желательно добавить стандартный алиас функции Trigger:
	SetTrigger = Trigger
в конец того большого куска кода переопределения.
Он, скорее всего, используется редко или вообще не используется, однако его тоже надо учитывать.
Ещё вопрос стоит обнуления триггера, чтобы обнулялся только нужный, так будет правильно:
Trigger("NHF", OBJECT_TOUCH_TRIGGER, mob, nil);?
Да, так верно.
А если в самой карте обнуляется Trigger( OBJECT_TOUCH_TRIGGER, mob, nil); , то не на все ли подействует?
Нет, по-умолчанию вызов триггера со стандартными параметрами (из руководства) будет интерпретирован как вызов от отправителя 0 (как число, не строка). То есть в данном случае обнулится только триггер, поставленный обычным способом, а все "специальные" останутся. Тем не менее, имитация через Trigger(0, ...) невозможна, т. к. это равносильно Trigger(NEW_DAY_TRIGGER, ...).
Как понимаю, если первый параметр = nil, это тоже является уникальным параметром отправителя.
Нет, первый параметр должен быть или числом (стандартный вызов), тогда оно будет принято как тип события, или строкой, тогда она будет принята как отправитель. Передача первым параметром nil вызовет ошибку attempt to concat a nil value.
При желании параметр отправителя можно поместить в конец как необязательный, тогда в качестве отправителя можно будет посылать любое значение, кроме nil (будет равнозначен незадаче параметра) и NaN (не индексируется в таблицах, так как не равен самому себе). Это потребует небольшой переделки кода.
__________________
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
Карты для Героев Меча и Магии 5
Одиночные: Завеса срывается, Посол, Последний рывок, Эхо Пустоты
Кампания: Империя Единорога

Существа NCF
Орден Порядка: 1
Нейтралы: 1 2 3 4
RedHeavenHero вне форума
Ответить с цитированием
Ответ
Страница 157 из 260


Опции темы



Часовой пояс GMT +4, время: 01:42.


vBulletin v3.5.0, Copyright ©2000-2024, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru