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

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

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

Ответ
Страница 258 из 258
 
Опции темы
#3856
Старый 29.05.2023, 01:52
  #3856
^
MaiorPain
📖
Регистрация: 14.09.2013
Сообщения: 9
Регистрация: 14.09.2013
Сообщения: 9
По умолчанию
Re: Скрипты

Большое спасибо за детальные комментарий ув. Долгий и ув. Jack of shadows. 

 

Проблема в том, что как я понимаю, если в хуке UnitMove я возвращаю not nil, то юнит не должен дальше перемещаться. У меня же получается ситуация, почему-то, что юнит и кастует заклинание, и делает ход, при чём ход он делает первым. Я перепроверил документацию Novik'a, там тоже написано, что UnitMove должен вызываться перед каждым ходом стека существа. 

 

То есть, ожидаемая последовательность действий:

1. Существо получает ход

2. Наступает хук UnitMove

3. В хуке я накладываю слепоту и возвращаю not nil

4. Существо остаётся на своём месте, проиграв анимацию заклинания. 

Реальная последовательность действий:

1. Существо получает ход

2. Наступакт хук UnitMove

3. Существо делает действие (бежит вперёд или атакует, если дотягивается)

4. Передаётся действие моему обработчику и существо накладывает заклинание

5. возвращается not nil

 

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

 

 

MaiorPain вне форума
Ответить с цитированием
#3857
Старый 29.05.2023, 18:31
  #3857
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1876
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1876
Выставка наград
По умолчанию
Re: Скрипты

А как выглядит ваш скрипт?
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3858
Старый 29.05.2023, 20:26
  #3858
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 500
Выставка наград
Регистрация: 08.09.2013
Сообщения: 500
Выставка наград
По умолчанию
Re: Скрипты

Всё должно быть как вы ожидаете, особых хитростей там нет. Надо обложить код принтами и смотреть, может он валится где-то до выхода из UnitMove().
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#3859
Старый 27.07.2023, 18:13
  #3859
^
BlueHeavenHero
 
Аватар для BlueHeavenHero
📖
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
По умолчанию
Re: Скрипты

Всем привет! Есть вопрос
Я написал скрипт по типу превращалки как в кампании РедХейвена, только оочень простую. Так вот, когда, например, кладу в превращалку 20 скелетов-лучников, то получаю 20 моих ncf скелетов, НО если я кладу туда два стека по 10 (то есть в общем 20), то результатом получаю 40(!)
----Превращалка: Хафад может преобразовывать обычную нежить в новых некроюнитов----
function CustomAbility(hero, id)
if (id == CUSTOM_ABILITY_3) then
Hero = hero
	MakeHeroInteractWithObject(hero, "ritual")
  	sleep(10)
   for i=0,6 do
		local type, num = GetObjectArmySlotCreature("ritual", i)
		if (type >= 30 and type <= 42 and mod(type, 2) == 0) or (type >= 152 and type <= 158) then
  startThread(NecroRitual)
  SetObjectOwner("ritual", PLAYER_2)
    end
  end
  local x,y = GetObjectPosition("Hafad")
  PlayVisualEffect("/Effects/_(Effect)/Spells/Curse.xdb#xpointer(/Effect)","","tag1", x+0.5,y+0.5,0,GROUND);
  PlayVisualEffect("/Effects/_(Effect)/Spells/DisruptingRay.xdb#xpointer(/Effect)","","tag1", x+0.5,y+0.5,0,GROUND);
  sleep(2)
  PlayVisualEffect("/Effects/_(Effect)/Spells/AnimateDead.xdb#xpointer(/Effect)","","tag1", x+0.5,y+0.5,0,GROUND);
    local Level = GetHeroLevel("Hafad")
    local Spell = GetHeroStat("Hafad", STAT_SPELL_POWER)
    local quantity = 0.35 * Level + Spell
    AddHeroCreatures("Hafad", 40, quantity)
    ShowFlyingSign("/Text/MasterOfDeath.txt", "Hafad", 1, 5.0)
    sleep(1)
    ControlHeroCustomAbility(hero, CUSTOM_ABILITY_3, CUSTOM_ABILITY_DISABLED)
    end
end

function NecroRitual()
	for i=0,6 do
		local type, num = GetObjectArmySlotCreature("ritual", i)
       if GetObjectArmySlotCreature("ritual", i) == 30 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 896, num)
       elseif type == 32 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 897, num)
       elseif type == 34 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 898, num)
       elseif type == 36 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 899, num)
       elseif type == 38 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 900, num)
       elseif type == 90 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 901, num)
       elseif type == 42 then
			     RemoveObjectCreatures('ritual', type, num, i)
			     AddHeroCreatures(Hero, 902, num)
			     end;
  end;
end;
BlueHeavenHero вне форума
Ответить с цитированием
#3860
Старый 27.07.2023, 21:29
  #3860
^
Долгий
 
Аватар для Долгий
📖
Регистрация: 23.04.2019
Сообщения: 86
Регистрация: 23.04.2019
Сообщения: 86
По умолчанию
Re: Скрипты

У меня есть предположение, что функция GetObjectArmySlotCreature() делалась в основном для получения id со слота, а не кол-ва юнитов и возвращает общее кол-во данных существ

Добавлено через 19 минут
Ну или sleep() не хватает из-за чего кол-во существ успевает посчитаться дважды
Долгий вне форума
Ответить с цитированием
#3861
Старый 03.08.2023, 13:27
  #3861
^
BlueHeavenHero
 
Аватар для BlueHeavenHero
📖
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
По умолчанию
Re: Скрипты

ДолгийУ меня есть предположение, что функция GetObjectArmySlotCreature() делалась в основном для получения id со слота, а не кол-ва юнитов и возвращает общее кол-во данных существ

Добавлено через 19 минут
Ну или sleep() не хватает из-за чего кол-во существ успевает посчитаться дважды
А в каком месте посоветуете поставить sleep()? Хочу сначала проверить второй вариант.
BlueHeavenHero вне форума
Ответить с цитированием
#3862
Старый 03.08.2023, 14:35
  #3862
^
Долгий
 
Аватар для Долгий
📖
Регистрация: 23.04.2019
Сообщения: 86
Регистрация: 23.04.2019
Сообщения: 86
По умолчанию
Re: Скрипты

BlueHeavenHeroА в каком месте посоветуете поставить sleep()? Хочу сначала проверить второй вариант.
Внутри цикла for, функции NecroRitual()
Долгий вне форума
Ответить с цитированием
#3863
Старый 14.08.2023, 18:00
  #3863
^
BlueHeavenHero
 
Аватар для BlueHeavenHero
📖
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
По умолчанию
Re: Скрипты

ДолгийВнутри цикла for, функции NecroRitual()
Так, у меня ничего не изменилось. походу надо переписывать весь скрипт ритуала(
BlueHeavenHero вне форума
Ответить с цитированием
#3864
Старый 19.08.2023, 13:42
  #3864
^
LetoX
 
Аватар для LetoX
📖
Регистрация: 16.11.2017
Сообщения: 67
Регистрация: 16.11.2017
Сообщения: 67
По умолчанию
Re: Скрипты

Я немного не понимаю эту часть - 

for i=0,6 do
     local type, num = GetObjectArmySlotCreature("ritual", i)
     if (type >= 30 and type <= 42 and mod(type, 2) == 0) or (type >= 152 and type <= 158) then
          startThread(NecroRitual)
          SetObjectOwner("ritual", PLAYER_2)
     end
end. 

и потом в функции ритуала - 

for i=0,6 do
    local type, num = GetObjectArmySlotCreature("ritual", i)
    if GetObjectArmySlotCreature("ritual", i) == 30 then
        RemoveObjectCreatures('ritual', type, num, i) ...

Зачем ты на каждый слот ставишь героя владельцем? По идее это можно сделать вне цикла. и почему ты на каждый слот начинаешь новый поток? Я скрипт не запускал, но выглядит так, будто ты на два слота стартуешь 2 потока работающих параллельно(типо) и когда обработка второго цикла по функции ритуала ПОВТОРНО проходит через все слоты, когда второй поток считывает первый слот он ещё не очищен(первым потоком). Вроде как, если убрать цикл в функции или убрать дублирование потоков, всё должно заработать. 



Типо-

        MakeHeroInteractWithObject(hero, "ritual")
        sleep(10)
        startThread(NecroRitual)
        SetObjectOwner("ritual", PLAYER_2)
        local x,y = GetObjectPosition(Hero) ...
А, и это чисто эстетически, но раз ты берёшь имя героя из функции, то почему пишешь в других местах "Hafad"? 
LetoX вне форума
Ответить с цитированием
#3865
Старый 19.08.2023, 14:47
  #3865
^
BlueHeavenHero
 
Аватар для BlueHeavenHero
📖
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
Регистрация: 20.08.2022
Адрес: "Асхан/Священная Империя Единорога/Светлолесье"
Сообщения: 316
По умолчанию
Re: Скрипты

LetoXЯ немного не понимаю эту часть - 

for i=0,6 do
     local type, num = GetObjectArmySlotCreature("ritual", i)
     if (type >= 30 and type <= 42 and mod(type, 2) == 0) or (type >= 152 and type <= 158) then
          startThread(NecroRitual)
          SetObjectOwner("ritual", PLAYER_2)
     end
end. 

и потом в функции ритуала - 

for i=0,6 do
    local type, num = GetObjectArmySlotCreature("ritual", i)
    if GetObjectArmySlotCreature("ritual", i) == 30 then
        RemoveObjectCreatures('ritual', type, num, i) ...

Зачем ты на каждый слот ставишь героя владельцем? По идее это можно сделать вне цикла. и почему ты на каждый слот начинаешь новый поток? Я скрипт не запускал, но выглядит так, будто ты на два слота стартуешь 2 потока работающих параллельно(типо) и когда обработка второго цикла по функции ритуала ПОВТОРНО проходит через все слоты, когда второй поток считывает первый слот он ещё не очищен(первым потоком). Вроде как, если убрать цикл в функции или убрать дублирование потоков, всё должно заработать. 
Я сам плохо понимаю в таких скриптах( Поэтому, наверное, и сделал два раза.
LetoXТипо-

        MakeHeroInteractWithObject(hero, "ritual")
        sleep(10)
        startThread(NecroRitual)
        SetObjectOwner("ritual", PLAYER_2)
        local x,y = GetObjectPosition(Hero) ...
А, и это чисто эстетически, но раз ты берёшь имя героя из функции, то почему пишешь в других местах "Hafad"? 
Ну, просто именно Хафад должен делать ритуал и получать войска, никому другому эта возможность недоступна, а в других местах так и оставил имя героя из функции

Добавлено через 44 секунды
Сейчас я шаманю над скриптом РедХевена по превращению обычных людей в зеленых. Вот это пляски с бубном...
BlueHeavenHero вне форума
Ответить с цитированием
Ответ
Страница 258 из 258


Опции темы



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


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

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