10

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

ELB359:
Lotus101, думаю, варкрафт слишком неудобен для этого, почему бы юнити не использовать?
Хочу сделать рпг картой с такой камерой, но там у парочки героев будет скил кинуть кинжал, ну и будет тупо если он просто полетит прямо от героя.
10

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

ENAleksey:
Кстати, а нет ли планов как-то объединить мод с JNGP?
Для подключения RenderEdge к Jass New Gen Pack (exp. 2) скачайте и замените файл wehack.lua в папке с JNGP (заменяет вкладку с RtC). Либо отредактируйте его самостоятельно:
wehack.lua
Пример того, как выглядит wehack.lua после редактирования
-- # begin RenderEdge #
RenderEdgePath = grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "InstallPath")
haveRenderEdge = grim.exists(RenderEdgePath .. "\\RenderEdge.exe")

function toggleRenderEdgeDebug(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 0)
	end
end

if haveRenderEdge then
	RenderEdgeMenu = wehack.addmenu("RenderEdge")
	RenderEdgeEnabled = TogMenuEntry:New(RenderEdgeMenu, "Run with RenderEdge", nil, true)
	RenderEdgeDebug = TogMenuEntry:New(RenderEdgeMenu, "Debug Mode", 
	    function(self) toggleRenderEdgeDebug(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 0)
	end
end
-- # end RenderEdge #

function testmap(cmdline)
	if haveRenderEdge and RenderEdgeEnabled.checked then
		local pos = string.find(cmdline, ".exe")
		cmdline = string.sub(cmdline, 5 + pos)
		cmdline = RenderEdgePath .. "\\RenderEdge.exe " .. cmdline
	end
	
	if wh_opengl.checked then
		cmdline = cmdline .. " -opengl"
	end
	if wh_window.checked then
		cmdline = cmdline .. " -window"
	end
	wehack.execprocess(cmdline)
end
Постарайтесь склеиться с mix файлом. Он вариком автоматически подгружается, так что думаю, что есть шанс разобраться и вклеить туда запуск своего кода
Пробовал, но что-то не получалось, возможно, из-за того, что загрузка mix файлов происходит после создания Direct3D, а для работы мода нужно перехватить эту функцию до её вызова.
Возможно, сделаю два способа внедрения RenderEdge: (Или лучше оставить только один вариант?)
  • Запуск через .exe;
  • Внедрение библиотеки в игру с помощью d3d8.dll/d3d9.dll в паке с варкрафтом.
Я не силен в джассе, но преобразовать в свою карту умею. Мне бы хотелось добавить в карту систему перемещения камеры от 3 лица на правую кнопку мыши и чтобы она двигалась плавно за героем, и передвижение героя на клавиши wasd, можете ли вы добавить это в мод или функции написать?
Я уже добавил вращение и приближение камеры при зажатом Ctrl и правой клавише мыши. Выложу обновлённую карту-пример вместе со следующей версией мода. Но если надо сейчас, то вот код (ещё изменится):
Камера
library Camera initializer Camera_Init
{
    private float facing = 0.0;
    private float aoa = 0.0;
    private float curCamDist = 0.0;

    private float cameraTime = 0.03125;
    private float sens = 0.05;

    private bool bRBM = false;
    private bool bCtrlPressed = false;


    private void OnMouseMove()
    {
        if (bCtrlPressed && bRBM)
        {
            int centerX = GetWindowWidth()/2;
            int centerY = GetWindowHeight()/2;
            float deltaX = I2R(centerX - GetMouseX()) * sens;
            float deltaY = I2R(centerY - GetMouseY()) * sens;
            
            if (GetMouseX() != centerX)
            {
                facing += deltaX;
                if (facing > 360.0)   { facing -= 360.0; }
                elseif (facing < 0.0) { facing += 360.0; }

                SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_ROTATION, facing, cameraTime);
            }
            
            if (GetMouseY() != centerY)
            {
                aoa += deltaY;
                if (aoa > 360.0)     { aoa = 360.0; }
                elseif (aoa < 275.0) { aoa = 275.0; }
                
                SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_ANGLE_OF_ATTACK, aoa, cameraTime);
            }
            
            SetMousePos(centerX, centerY);
        }
    }

    private void OnKeyboardDown()
    {
        if (GetTriggerKey() == 17 && !IsKeyDown(1) && !IsKeyDown(2))
        {
			curCamDist = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE);
            BlockMouse(true);
            //ShowCursor(false);
            bCtrlPressed = true;
        }
    }

    private void OnKeyboardUp()
    {
        if (GetTriggerKey() == 17)
        {
            BlockMouse(false);
            //ShowCursor(true);
            bCtrlPressed = false;
        }
    }
                
    private void OnMouseDown()
    {
        bRBM = true;
        if (bCtrlPressed)
        {
            facing = GetCameraField(CAMERA_FIELD_ROTATION) * bj_RADTODEG;
            aoa = GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK) * bj_RADTODEG;
            SetMousePos(GetWindowWidth()/2, GetWindowHeight()/2);
        }
    }
            
    private void OnMouseUp()
    {
        bRBM = false;
    }

    private void OnWheelEvent()
    {
        if (bCtrlPressed)
        {
            curCamDist -= I2R(GetWheelDelta()) * 0.5;
            if (curCamDist < 300.0)
            {
                curCamDist = 300.0;
            }
            elseif (curCamDist > 3000.0)
            {
                curCamDist = 3000.0;
            }
            SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_TARGET_DISTANCE, curCamDist, cameraTime);
        }
    }

    //===========================================================================
    private void Camera_Init()
    {
        trigger temp = CreateTrigger();
        TriggerRegisterTimerEvent(temp, cameraTime, true);
        TriggerAddAction(temp, function OnMouseMove);
        //TriggerRegisterMouseMoveEvent(temp);

        temp = CreateTrigger();
        TriggerAddAction(temp, function OnKeyboardDown);
        TriggerRegisterKeyEvent(temp, KEY_Any, EVENT_Down);

        temp = CreateTrigger();
        TriggerAddAction(temp, function OnKeyboardUp);
        TriggerRegisterKeyEvent(temp, KEY_Any, EVENT_Up);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnMouseDown);
        TriggerRegisterMouseEvent(temp, MB_Right, EVENT_Down);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnMouseUp);
        TriggerRegisterMouseEvent(temp, MB_Right, EVENT_Up);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnWheelEvent);
        TriggerRegisterMouseWheelEvent(temp);
    }
}
Готовую систему перемещения камеры от первого лица (легко переделать для третьего лица) можно взять отсюда, в RenderEdge есть все необходимые функции для реализации.
Ок спасибо, вот еще что думаю, можно ли сделать как в шутере за счет вашей функции определения положения мышки? Я просто сам не могу придумать как сделать полет пули в выбранную точку на экране, а если это обычный предмет, то чтобы он еще падал со временем. И подскажи пжл как установить этот шарпкрафт, на том сайте вроде как нету пояснений для установки.
10

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

darkowlom:
Lotus101, список функций есть выше, эти тоже включены
Я не силен в джассе, но преобразовать в свою карту умею. Мне бы хотелось добавить в карту систему перемещения камеры от 3 лица на правую кнопку мыши и чтобы она двигалась плавно за героем, и передвижение героя на клавиши wasd, можете ли вы добавить это в мод или функции написать?
10

» RenderEdge / [RenderEdge] Графическая модификация для WarCraft III

darkowlom:
alexprey, микс грузится только при запуске игры из папки варика, склеиться не получится, а вызвать эту функцию без доступа к асму невозможно, джаззкал выполняет псевдокод
Lotus101, тем не менее да
Это же потрясающе, эта версия сможет со временем тоже иметь все эти функции?
10

» WarCraft 3 / Вредные советы

vlad_C0M:
))) Ну надо же.. Столько лет, а до сих пор комментарии есть). Спасибо что живой XGM. Бальзам на душу да скупую слезу родной.
11 лет, я новичок и я в шоке 0_0
10

» WarCraft 3 / Утечка при создании юнита

quq_CCCP:
Ты уверен что это юнит создает утечку? Кол-во хендлов растет, ибо юнит то никуда не делся...
В карте других триггеров нет, эти я юзал по отдельности.
10

» WarCraft 3 / Как убрать утечку группы

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

» WarCraft 3 / Как убрать утечку группы

Tumart:
Lotus101, хм ну можно и так ) нет получается лишних нет. А лучше сделал бы как на втором скрине просто убери удалить юнитов из группы и обнули
А зачем в скрипте call GroupEnumUnitsInRangeOfLoc(udg_Group, udg_Point,200., null) после Point, нет пробела и после 200 точка это важно?
10

» WarCraft 3 / Как убрать утечку группы

Tumart:
Lotus101, ни че не понял зачем ты два раза делаешь одно и тоже? выбрал юнитов далее через ForGroup(udg_Croup,function нужная функция) лан в общем лучше делай как на втором скрине там незначительная утечка
Все все дошло, спасибо помогло. Поменял последняя группа юнитов на Group больше утечек нет вообще (хотя при первом использовании способности пропдают 2 утечки, потом прибавляется одна а дальше ничего не меняется, странно) Еще вопрос, все эти скрипты обязательно писать надо, может какие-то лишние?
10

» WarCraft 3 / Как убрать утечку группы

Tumart:
nvc123, вот в этой функции создается локальная группа и не обнуляется
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction
но да ладно HandleCounter считает локации
Значит из за того что не обнулял.
Сделал вот так, действие выбрать юнитов и цикл мне нужно обязательно, все равно прибавляется одна утечка (теперь иногда)
Загруженные файлы
10

» WarCraft 3 / Как убрать утечку группы

Tumart:
Lotus101, ты удалил действие Установить Group=Юниты в радиусе?
Если я его удалю как тогда работать скил будет?
10

» WarCraft 3 / Как убрать утечку группы

Tumart:
Lotus101, ну гуи только через CustomScript он же JassCode
Личный Сценарий GroupEnumUnitsInRangeOfLoc(udg_Group, udg_Point,200., null)
Я так понял надо так: call GroupEnumUnitsInRangeOfLoc(udg_Group, udg_Point, 200, null) Хотя и ваше тоже копировал, просто непонятно почему пробела перед 200 нет и после 200 точка. Все равно также прибавляется одна утечка.
10

» WarCraft 3 / Как убрать утечку группы

Tumart:
Юниты в радиусе содержит такую функцию создающюю утечку группы
function GetUnitsInRangeOfLocMatching takes real radius, location whichLocation, boolexpr filter returns group
    local group g = CreateGroup()
    call GroupEnumUnitsInRangeOfLoc(g, whichLocation, radius, filter)
    call DestroyBoolExpr(filter)
    return g
endfunction
Делай как на втором скрине только в CustomScript добавляй вот эту функцию вместо(Юниты в радиусе)
GroupEnumUnitsInRangeOfLoc(group, whichLocation, radius, null)
А лучше используй GroupEnumUnitsInRange юзай не точки а координаты x,y
А на гуи можно пожалуйста?
10

» WarCraft 3 / Как удалить !!область!!

Из-за области создаются утечки? Вверху пишут, что удалять не надо, то есть утечек нет?
10

» WarCraft 3 / Как лучше учится созданию карт?

nvc123:
Lotus101, для того чтобы юзать эту функцию тебе надо прочесть все статьи(а именно jass, vjass, cjass, потоки) что я кинул иначе ты нифига не поймёшь
на этом сайте левых статей нету (по крайне мере в этом списке )
Понятно, если без всех знаний джасса никак тогда ок.
10

» WarCraft 3 / Как лучше учится созданию карт?

quq_CCCP:
Lotus101, Нет низя, там стоит защита от копирования, нужно все делать своими руками!
Tumart, что то nvc123, не пишит, с чужой депротектнутой карты можно начинать уже довольно скилловым мапмейкерам, то у некоторых в исходниках черт ногу сломит.
Ну а~Lotus101, читай статьи про примеры построения кода, смотри в открытых картах близзов - там комменты есть. правда требуется инглиш.
В картах близзов будет эта система? Зачем мне читать левые статьи, меня только эта функция интересует.
10

» WarCraft 3 / Как лучше учится созданию карт?

nvc123:
если будешь делать кучу триггерных спелов то стоит посмотреть вот эту наработку
она позволит уменьшить количество триггеров в карте и кода который необходимо писать
Можно узнать пожалуйста, есть ли статьи по использованию этой системы или как ей пользоваться, просто скопировать в карту без изменений?
10

» WarCraft 3 / hash таблицы gui

molot39:
Lotus101
Правда, ты там уже карту сделал что ли?)
Нет, скилы переписал, сейчас буду свой делать

Держи, переписал, почти идентично. Над своим ещё работаю.
Болванка
Спасибо огромное, ты лучший
10

» WarCraft 3 / Ближайший объект в области

Кет:
Lotus101, и юнит получит приказ взаимодействовать по очереди со всеми декорациями.
Если он делает скил, то именно это и надо
10

» WarCraft 3 / hash таблицы gui

Sergey105:
Lotus101, Я не хочу оскорбить но уже как то много помешанных на наруто и да если ты заинтересован в разработке чего либо в сфере комп то делать надо на уровне кода а не ссылок . Я сам пол года назад только триггерно лепил но затем решил по пробывать на jass коде и меня увлекло постепенно я освоился и теперь без проблем много вещей делаю и гораздо проще чем на триггерах так что пробывай не ленись трудного там нечего нет .
Lotus101, если что могу пояснить хеш на jass
но это не лучший вариант
Да вот тоже уже думаю, просто долго работал в гуи и все было прекрасно, но когда дело доходит до сложностей, то морока начинается. Про то что карт наруто много, но хороших рпг по нему парочка и так себе на самом деле, поэтому хочу сделать очень хорошую рпг, ведь почва для этого большая.
molot39:
Автору лишь нужно изучить как что работает и только. Я переписал две способности, осталась только одна, и добавлю ещё одну (тп к кунаю).
Правда, ты там уже карту сделал что ли?)