Версия v0.3.0
Графическая модификация для игры WarCraft III.
287 87K
13
ssbbssc, если вы про миникарту, то это я случайно нажал на кнопку скрытия ландшафта и долго не мог понять, в чём дело :)
20
На скринах с гером на панели приказов от нас замазали что-то вкусное
10
ENAleksey:
Lotus101, посмотри эту систему, либо сделай сам. Для движения снарядов нужно написать всего-лишь одну-две формулы. Ещё можешь посмотреть наработки для Unreal Engine, Unity, либо прочитать книги по игровой физике.
Спасиб, а как установить и пользоваться sharpcraft знаешь?
13
Lotus101, посмотри эту систему, либо сделай сам. Для движения снарядов нужно написать всего-лишь одну-две формулы. Ещё можешь посмотреть наработки для Unreal Engine, Unity, либо прочитать книги по игровой физике.
10
ELB359:
Lotus101, думаю, варкрафт слишком неудобен для этого, почему бы юнити не использовать?
Хочу сделать рпг картой с такой камерой, но там у парочки героев будет скил кинуть кинжал, ну и будет тупо если он просто полетит прямо от героя.
7
Lotus101, думаю, варкрафт слишком неудобен для этого, почему бы юнити не использовать?
10
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 есть все необходимые функции для реализации.
Ок спасибо, вот еще что думаю, можно ли сделать как в шутере за счет вашей функции определения положения мышки? Я просто сам не могу придумать как сделать полет пули в выбранную точку на экране, а если это обычный предмет, то чтобы он еще падал со временем. И подскажи пжл как установить этот шарпкрафт, на том сайте вроде как нету пояснений для установки.
24
ELB359, зачем это нужно? подсветка нативки? Толку мало
7
darkowlom, я не так выразился, автодополнение в JNGP знает только стандартные функции.
24
ELB359, он их и так видит, прописываешь в коде карты
native void CtrlSetText(int id, string text, bool bWrap)