Добавлен , опубликован
Новая версия библиотеки, расширяющая возможности движка без добавления нативок.
с этого момента будет ввестись лог версий.
v1 - бэта версия, с урезанным функционалом.
v2 - Стабильная версия.
-Отлов нажатий любой клавиши клавиатуры.
-Отлов работы мыши.
-Добавлена функция чата.
-Добавлена функция ограничивающая движение мышки
-Добавлена функция смена координат курсора
!!
Внимания ! функция fun_pressed_I и другие заменена на fun_pressed_Key!!
jass

globals
    hashtable HT = InitHashtable() // ХешТаблица для обменна инфой с библиотекой
endglobals



// Функция инициализации, без нее ничего работать не будет
function InitSys takes nothing returns nothing
    call SetPlayerTechMaxAllowed(Player(15),900125,GetHandleId(HT))
endfunction

//Передвигает курсор в нужное место
function CursorMove takes integer mouseX, integer mouseY returns nothing
    call SaveInteger(HT,0,0,1)
    call SaveInteger(HT,-3,1,1)
    call SaveInteger(HT,-3,2,mouseX)
    call SaveInteger(HT,-3,3,mouseY)
endfunction


// Устанавливает границу мышки, не следует задавать очень маленькие размеры, так как может привести к лагу.
// Принимает значения int -  измеряется в пикселях экрана.
function SetBorderMouse takes integer minX, integer minY, integer maxX,integer maxY returns nothing

call SaveInteger(HT,0,0,1)
call SaveInteger(HT,-6,1,1)
call SaveInteger(HT,-6,2,minX )
call SaveInteger(HT,-6,3,minY )
call SaveInteger(HT,-6,4,maxX )
call SaveInteger(HT,-6,5,maxY )

endfunction


//Очищает ограничения мыши.
function ClearBorderMouse takes nothing returns nothing

call SaveInteger(HT,0,0,1)
call SaveInteger(HT,-6,1,1)
call SaveInteger(HT,-6,2,-127 )
call SaveInteger(HT,-6,3,-127 )
call SaveInteger(HT,-6,4,-127 )
call SaveInteger(HT,-6,5,-127 )

endfunction



//Отраправляет сообщение игроку
function PlayerText takes string text, real duration returns nothing
    local integer CurrentQueue = LoadInteger(HT,-4,1)
    call SaveInteger(HT,0,0,1)
    
    call SaveInteger(HT,-4,1,CurrentQueue+1)
    call SaveStr(HT,-4,2+CurrentQueue*2,text)
    call SaveReal(HT,-4,3+CurrentQueue*2,duration)
endfunction

	
// Получаем значения курсора в точках, относительно левого верхного угла.
function GetMouseX takes nothing returns integer
    return LoadInteger(HT,-1,1)
endfunction
function GetMouseY takes nothing returns integer
    return LoadInteger(HT,-1,2)
endfunction





// Возвращает код нажатой и отжатой клавиши.
function GetTriggerKey takes nothing returns integer 
    return LoadInteger(HT,-5,1) //Возвращает локальное значения для игрока
endfunction

// Получаем из реестра, значения формата экрана.
function GetScreenWidth takes nothing returns integer
    return LoadInteger(HT,-2,1)
endfunction
function GetScreenHeidht takes nothing returns integer
    return LoadInteger(HT,-2,2)
endfunction



// Функция срабатывает после нажатия клавиши
function fun_pressed_Key takes nothing returns nothing returns nothing
    // все действия для локального игрока, для мультиплеера нужно синхронизовать с помощью выделения юнита или другим способом
    call DisplayTextToPlayer(Player(0),0,0,I2S(GetTriggerKey()))
    
    call SetBorderMouse(25,25,400,400)
    
endfunction
// Функция срабатывает, после того, как клавиша больше не зажата
function fun_release_Key takes nothing returns nothing returns nothing
    call ClearBorderMouse()
    // все действия для локального игрока, для мультиплеера нужно синхронизовать с помощью выделения юнита или другим способом
endfunction



// События нажатия на клавиши мыши.
function fun_pressed_LMB takes nothing returns nothing
call DisplayTextToPlayer(Player(0),0,0,"fun_pressed_LMB")
endfunction

function fun_release_LMB takes nothing returns nothing
call DisplayTextToPlayer(Player(0),0,0,"fun_release_LMB")
endfunction


function fun_pressed_RMB takes nothing returns nothing
call DisplayTextToPlayer(Player(0),0,0,"fun_pressed_RMB")
endfunction

function fun_release_RMB takes nothing returns nothing
call DisplayTextToPlayer(Player(0),0,0,"fun_release_RMB")
endfunction
Скачать:
В этой версии так упорно правил вылеты, что ест ресурсы проца больше, чем надо, в дальнейшим оптимизирую.
Так-же планирую:
  • Система Save/Load.
  • Общения с интернет адресами, в том числе возможность закачки во время игры моделей, текстур и других файлов для варкрафта
  • Отрисовка интерфейса. (dgui)
`
ОЖИДАНИЕ РЕКЛАМЫ...
6
Sumert:
Alexander12:
выкидывает
видимо из за редактора, пользуешься стандартным WE ?
Такс... скоро обнова.
нет, jpng.
Версия: 5d
Сборка: Exp2
попробовал стандартным редактором, пришлось слегка код поменять. Отлов клавиш работает (добавил отлов других клавиш для теста - все пашет, как надо), а вот почему-то отлов мыши перестал. Не реагируют функции, хоть ты тресни. При чем перестал даже в обычной карте.
Заметил баг: если в процессе игры возникает диалоговое окно, то выйдя из него, отлов не работает.
скоро выложу новую карту, там подробно опишу, чтобы все работало. И другие карты не вылетали. Кстати проблему с вылетами решил. все будет позже, и оформлю тему.
13
Alexander12, а никак нельзя сделать такие же функции, как и в SharpCraft: GetTriggerKey() return int/str или IsKeyDown(int/str) return bool, вместо того, чтобы создавать для каждой кнопки по 2 функции?
6
ENAleksey, так думаю и сделаю. (просто первая версия работала без массива). сегодня ближе к ночи выпущу новую версию.
13
Alexander12, а можно ли подключить твой мод в качестве .lib библиотеки к пользовательскому C++ проекту и передавать данные в варкрафт через твой мод? Например, у меня есть своя .dll библиотека, которую могу подключить к варкрафту, и я хочу передать значение переменной из своей библиотеки в WarCraft посредством твоего мода.
6
Alexander12, а что насчет бага с диалоговыми окнами? Если это окно запустить, а потом скрыть, функции отлова перестают работать. Этот баг можно как-то обойти?
6
Alexander12, а что насчет бага с диалоговыми окнами? Если это окно запустить, а потом скрыть, функции отлова перестают работать. Этот баг можно как-то обойти?
другую синхронизацию делать, просто во время диалога, юниты не выделяются. или в это время, перед выбором юнита скрыть диалог, и после опять отобразить
6
Alexander12, не понял( Вот я показал диалог, игрок нажал на кнопку, диалог скрылся. И тогда не работают функции. Посмотри карту. Я сымитировал диалог после 5 секунд с момента инициализации карты. При нажатии диалог отчищается и скрывается. А функции перестают работать.
Загруженные файлы
13
Sumert, ты в функции fun_pressed_I показываешь текст или выделяешь юнита? Если выделяешь юнита, то попробуй вывести текст и посмотри, будет ли работать.
Alexander12, почему функция GetMouseX возвращает значение integer, а не real?
6
Я понял, как избежать бага. Надо добавлять call DialogDestroy (переменная_диалог).
ENAleksey, текст.
Кстати, координаты GetMouseX() и GetMouseY() немного неудобны, ибо не совпадают с координатами карты. Начало координат там всегда в левом верхнем углу экрана. Пока не знаю, как их преобразовывать так, чтобы они были именно координатами того, куда ткнули. Я еще не тестировал, будут ли координаты меняться в зависимости от дальности камеры, но подозреваю, что да.
6
Кстати, координаты GetMouseX() и GetMouseY() немного неудобны, ибо не совпадают с координатами карты. Начало координат там всегда в левом верхнем углу экрана. Пока не знаю, как их преобразовывать так, чтобы они были именно координатами того, куда ткнули. Я еще не тестировал, будут ли координаты меняться в зависимости от дальности камеры, но подозреваю, что да.
real X_ = I2R(GetScreenWidth()/2 - GetMouseX())/GetScreenWidth() и получаем значение от -1 до 1.
Новая версия готова ! жду когда опубликуют.
Опубликовали
6
example невозможно скачать
Alexander12:
real X_ = I2R(GetScreenWidth()/2 - GetMouseX())/GetScreenWidth() и получаем значение от -1 до 1.
И что это дает?
Скачал просто mix файл и вставил код из темы. Работает, как часы. Ни багов, ни вылетов)
А, не( В кампании по-прежнему вылетает.
28
Sumert, ты читай полностью комменты
тот код для превращения пиксельных координат в дробные относительно центра экрана
6
nvc123, да, я сообразил, как это использовать, благодарю.
С кампанией пока думаю. Если отдельная карта работает без сбоев, то стоит её засунуть в только что созданную кампанию и пересохранить карту, как все - черный экран. Забавно, что если карту, которую всунул в кампанию, не пересохранять, то карта работает как надо. Заметил, что карта перестает запускаться, когда добавляешь инициализацию хеш-таблицы.
33
Как я понимаю, библиотека всё-таки есть. А чем это лучше RtC и иже с ним?
28
Кет, не трогает нативки что позволяет пройти тест на читы в мультиплеере
а с помощью выделения юнитов убираем десинхроны
Как я понимаю, библиотека всё-таки есть
Key.mix это не архив
это библиотека
33
Как я понимаю, библиотека всё-таки есть
Key.mix это не архив
это библиотека
Ну я и написал, что библиотека всё-таки есть.
6
Кет:
Как я понимаю, библиотека всё-таки есть
Key.mix это не архив
это библиотека
Ну я и написал, что библиотека всё-таки есть.
то, что к игре может подключиться игрок и без этого микса
3 комментария удалено
6
Alexander12, в теме пару ошибок. Во-первых, example не скачивается. Во-вторых, у тебя опечатки:
"function fun_pressed_Key takes nothing returns nothing returns nothing"
"function fun_release_Key takes nothing returns nothing returns nothing"
6
Появилась идейка, о быстрой синхронизации информации. через приказы юнитов, со стороны игры - создать 2 юнита в углу, с углом поворота 0 и 90 градусов. Со стороны библиотеки - отдавать приказы этим юнитам, один по x, другой по y координатам. Тем самым можно синхронизировать игровые координаты мышки. Принципе можно синхронизовать любые данные.
4
Как в функции fun_pressed_Key отследить игрока, который нажал кнопку? Ну скажем мне надо внести его в переменную.
21
Апгрейд варкрафта с помощью сторонних библиотек - дело сомнительное. Ввиду того игрокам самим придётся качать библиотеку, а это дополнительные заморочки.
Хотя функционал с помощью подобных вещей довольно велик.
Например
Чтобы оставить комментарий, пожалуйста, войдите на сайт.