Добавлен , опубликован
Warcraft III - Lua - это модификация, позволяющая встраивать lua script'ы в свои карты. Некоторый стандартный функционал lua был ограничен в целях безопасности пользователей и игроков. В силу различий JASS и lua, некоторые нативные функции Warcraft III могут работать некорректно. Вы имеете возможность поспособствовать развитию проекта, написав об ошибках и багах.

Текущая версия: 1.3.7 (Blight)
Версия lua: 5.4.4
Поддерживаемый патч игры: 1.24e/1.26a/1.27a/1.27b/1.28f Патчи выше 1.26a нуждаются в дополнительных тестах.
Список изменений
  • 1.3.7 (Brlight) - исправлен баг с постоянной утечкой памяти lua потоков из-за особенности самого lua (спасибо за наводку, nazarpunk), добавлен префикс к lua ошибкам в случае запуска игры через UjAPI.
  • 1.3.6 (Brlight) - нативные функции могут использоваться из handle'ов, сами же handle'ы реализованы в виде таблицы (спасибо, Kokomi), что позволяет производить обращения по типу:
Player(0):CreateUnit(FourCC('Hpal'), 0, 0, 0):KillUnit()
-- Вместо
KillUnit(CreateUnit(Player(0), FourCC('Hpal'), 0, 0, 0))
  • 1.3.5 (Brlight) - добавлена поддержка UjAPI и всех jass native'ок, которые он с собой приносит. Добавлена возможность чтения JASS переменных, вплоть до переменных, объявленных в карте. Исправлен баг с остановкой триггера/таймера, в котором была допущена ошибка, теперь игра не вылетает. Сделан корректный конвертер float значений в jReal. Исправлен баг с пропажей аргументов. Исправлена утечка памяти, вызванная в случае использования анонимок при регистрации триггеров, таймеров и т.д. Изменён формат вывода оповещений. Добавлена возможность выводить цветной текст в консоль, посредством использования цветового кода как в самой игре. Теперь вместо любого типа, являющегося handle'ом (unit, location, widget...), может использоваться непосредственно тип handle, который возвращается во время обращения к JASS переменным. В случае такого использования, вам будет выводиться уведомление о преобразовании, при условии, что вы находитесь в dev режиме. При необходимости, вы можете отключить эти уведомления, прописав параметр -nowarnings. Чтобы использовать мод как модуль к UjAPI, разместите его по пути "UjAPI\UjAPIFiles\Modules". Если же вы хотите обойтись без UjAPI, вы можете сменить расширение с dll на mix и поместить мод в папку с игрой, однако вы не сможете использовать новые функции UjAPI без его непосредственного участия.
...
  • 1.2.9 (Outland) - добавлена поддержка других патчей. Добавлена функция GetMapFileName(bool flag), возвращающая путь файла карты относительно папки игры, если flag равен true, и имя файла карты, если false.
  • 1.1.9 (Outland) - StormOpenFile заменен на StormOpenFileEx, чтобы исправить ошибку с поиском файлов на локальном диске, когда нам нужно открыть файл из mpq. Также был добавлен режим для require, который позволяет использовать точку в пути вместо \\ (идея от Kirill78, все жалобы к нему 😀 ).
  • 1.1.8 (Outland) - фикс бага в "dofile". Lua-функция "loadfile" теперь также переписана, как и "dofile".
  • 1.1.7 (Outland) - Lua-функция "dofile" переписана. Теперь она работает в 2-х режимах:
    1. Режим по умолчанию: файлы выполняются только из mpq архивов;
    2. Режим разработчика: файлы выполняются как из mpq архивов, так и из папки с игрой.
  • 1.1.6 (Outland) - убраны фреймы (ненадолго). Исправлены баг с произвольным вылетом, в случае использования анонимок. Добавлен автоматический парсер нативок JASS, а также типов. Добавлена типизация для нативок JASS (бережёного код бережёт), а также псевдо-наследование. Исправлен баг с некорректной передачей аргументов при вызове нативок JASS. Исправлен баг со stacktrace'ом, теперь он действительно отображается. Добавлена возможность подключения с помощью мемхака. И т.д. (я просто уже забыл часть того, что наворотил). P.s. ждём новых нативок для JASS. 😉
  • 1.1.4 (Ashenvale) - добавлены фреймы. Добавлен режим разработчика (-dev) со снятыми на lua ограничениями. Добавлен заперт на подключение к пользователям без мода и наоборот. Добавлен фикс широкоформатных экранов. Изменена карта-пример.
  • 1.1.3 (Beta) - оптимизирован код преобразования float2jReal. Исправлен вылет после попытки запуска триггера с ошибкой. Добавлен stack trace и всплывающее сообщение. Добавлено сообщение о критической ошибке, а именно отсутствие необходимого количества аргументов, при попытке вызова стандартных функций Warcraft III . Исправлена ошибка, из-за которой мог произойти десинк, так как сборщик мусора поспешно удалял значения. Исправлена ошибка с потерей аргументов во время переадресации вызова lua2jassnative.
Как и писал N1ghtSiren, вы можете добавить параметры запуска в JNGP, что позволит вам использовать скрипты из директории Warcraft III. Таким образом вы сможете работать со скриптами в отдельной среде, к примеру Visual Studio Code или Sublime Text. Приложенный им wehack.lua.
Установка
Чтобы использовать мод как модуль к UjAPI, разместите его по пути "UjAPI\UjAPIFiles\Modules". Если же вы хотите обойтись без UjAPI, вы можете сменить расширение с dll на mix и поместить мод в папку с игрой, однако вы не сможете использовать новые функции UjAPI без его непосредственного участия.
Инструкция по эксплуатации
  1. Создать в карте (её архиве) папку Scripts. В неё перенесите blizzard.lua и common.lua. (Необязательно, позволяет использовать стандартные константы blizzard.j, common.j)
  2. Поместить ваш lua script в архив карты. Обязательно переименуйте его в war3map.lua!
  3. Наслаждайтесь игрой.
Для отображения консоли, запускайте Warcraft с параметром -console.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
18
Это Open Source проект
А в dzapi рекомендуется перезапускать вар после игры
8
Bogdan Shmay
К несчастию или нет, у луа машины в рефорже и тут разные наборы доступных и реализованных функций, в том числе с разным именованием. Вероятно, проблемы возникают с использованием функций типа изменения описаний способностей и тому подобного.
С определенными изменениями код должен работать.
18
w3champions это отдельный лаунчер для варкрафта
1
w3champions это отдельный лаунчер для варкрафта
Лаунчер то отдельный, но в их картах есть команды, которые работают с помощью луа.
И я хотел бы, что бы они работали и на 1.26, но не судьба
18
Либо это функции которые связаны исключительно с их лаунчером, который у них только с 1.32+
Либо это Blz-функций рефоржа, которых нет и не было на 1.26, и которые относятся к api игры, а не к lua. На 1.26 вместо них функции из мемхака
1
Bogdan Shmay
К несчастию или нет, у луа машины в рефорже и тут разные наборы доступных и реализованных функций, в том числе с разным именованием. Вероятно, проблемы возникают с использованием функций типа изменения описаний способностей и тому подобного.
С определенными изменениями код должен работать.
Честно говоря, я особо в этом не разбираюсь, всё таки что-то можео сделать, что бы w3c код работал с помощью данного мода на 1.26?

Либо это функции которые связаны исключительно с их лаунчером, который у них только с 1.32+
Либо это Blz-функций рефоржа, которых нет и не было на 1.26, и которые относятся к api игры, а не к lua. На 1.26 вместо них функции из мемхака
W3c код работает не только на рефордже, а на всех версиях варкрафта в которых есть lua (то-есть начиная с 1.31)
Загруженные файлы
20
Bogdan Shmay
К несчастию или нет, у луа машины в рефорже и тут разные наборы доступных и реализованных функций, в том числе с разным именованием. Вероятно, проблемы возникают с использованием функций типа изменения описаний способностей и тому подобного.
С определенными изменениями код должен работать.
Честно говоря, я особо в этом не разбираюсь, всё таки что-то можео сделать, что бы w3c код работал с помощью данного мода на 1.26?

Либо это функции которые связаны исключительно с их лаунчером, который у них только с 1.32+
Либо это Blz-функций рефоржа, которых нет и не было на 1.26, и которые относятся к api игры, а не к lua. На 1.26 вместо них функции из мемхака
W3c код работает не только на рефордже, а на всех версиях варкрафта в которых есть lua (то-есть начиная с 1.31)
Их мод на версии 1.26а и в файле что ты загрузил есть отсылки на Blz нативки, которых нет в 1.26а. О чём Влод и писал.
1
Bogdan Shmay
К несчастию или нет, у луа машины в рефорже и тут разные наборы доступных и реализованных функций, в том числе с разным именованием. Вероятно, проблемы возникают с использованием функций типа изменения описаний способностей и тому подобного.
С определенными изменениями код должен работать.
Честно говоря, я особо в этом не разбираюсь, всё таки что-то можео сделать, что бы w3c код работал с помощью данного мода на 1.26?

Либо это функции которые связаны исключительно с их лаунчером, который у них только с 1.32+
Либо это Blz-функций рефоржа, которых нет и не было на 1.26, и которые относятся к api игры, а не к lua. На 1.26 вместо них функции из мемхака
W3c код работает не только на рефордже, а на всех версиях варкрафта в которых есть lua (то-есть начиная с 1.31)
Их мод на версии 1.26а и в файле что ты загрузил есть отсылки на Blz нативки, которых нет в 1.26а. О чём Влод и писал.
Эти Bliz нативы возможно чем-то заменить не нарушая работу кода?
33
Line 2207:             return BlzCameraSetupGetLabel(self.handle)
	Line 2210:             BlzCameraSetupSetLabel(self.handle, label)
	Line 2222:     BlzCameraSetupApplyForceDurationSmooth(self.handle, doPan, forcedDuration, easeInDuration, easeOutDuration, smoothFactor)
	Line 2684:             return BlzGetPlayerTownHallCount(self.handle)
	Line 2693:     BlzDecPlayerTechResearched(self.handle, techId, levels)
	Line 2932:             return BlzGetSpecialEffectScale(self.handle)
	Line 2935:             BlzSetSpecialEffectScale(self.handle, scale)
	Line 2945:             return BlzGetLocalSpecialEffectX(self.handle)
	Line 2948:             BlzSetSpecialEffectX(self.handle, x)
	Line 2958:             return BlzGetLocalSpecialEffectY(self.handle)
	Line 2961:             BlzSetSpecialEffectY(self.handle, y)
	Line 2971:             return BlzGetLocalSpecialEffectZ(self.handle)
	Line 2974:             BlzSetSpecialEffectZ(self.handle, z)
	Line 2980:     BlzSpecialEffectAddSubAnimation(self.handle, subAnim)
	Line 2983:     BlzSpecialEffectClearSubAnimations(self.handle)
	Line 2989:     BlzPlaySpecialEffect(self.handle, animType)
	Line 2992:     BlzPlaySpecialEffectWithTimeScale(self.handle, animType, timeScale)
	Line 2995:     BlzSpecialEffectRemoveSubAnimation(self.handle, subAnim)
	Line 2998:     BlzResetSpecialEffectMatrix(self.handle)
	Line 3001:     BlzSetSpecialEffectAlpha(self.handle, alpha)
	Line 3004:     BlzSetSpecialEffectColor(self.handle, red, green, blue)
	Line 3007:     BlzSetSpecialEffectColorByPlayer(self.handle, whichPlayer.handle)
	Line 3010:     BlzSetSpecialEffectHeight(self.handle, height)
	Line 3013:     BlzSetSpecialEffectOrientation(self.handle, yaw, pitch, roll)
	Line 3016:     BlzSetSpecialEffectPitch(self.handle, pitch)
	Line 3019:     BlzSetSpecialEffectPositionLoc(self.handle, p.handle)
	Line 3022:     BlzSetSpecialEffectPosition(self.handle, x, y, z)
	Line 3025:     BlzSetSpecialEffectRoll(self.handle, roll)
	Line 3028:     BlzSetSpecialEffectMatrixScale(self.handle, x, y, z)
	Line 3031:     BlzSetSpecialEffectTime(self.handle, value)
	Line 3034:     BlzSetSpecialEffectTimeScale(self.handle, timeScale)
	Line 3037:     BlzSetSpecialEffectYaw(self.handle, y)
	Line 3218:                 BlzCreateSimpleFrame(name, owner.handle, priority)
	Line 3223:                 BlzCreateFrame(name, owner.handle, priority, createContext)
	Line 3233:             return BlzFrameGetAlpha(self.handle)
	Line 3236:             BlzFrameSetAlpha(self.handle, alpha)
	Line 3268:             return BlzFrameGetChildrenCount(self.handle)
	Line 3278:             return BlzFrameGetEnable(self.handle)
	Line 3281:             BlzFrameSetEnable(self.handle, flag)
	Line 3291:             return BlzFrameGetHeight(self.handle)
	Line 3294:             BlzFrameSetSize(self.handle, self.width, height)
	Line 3305:                 BlzFrameGetParent(self.handle)
	Line 3309:             BlzFrameSetParent(self.handle, parent.handle)
	Line 3319:             return BlzFrameGetText(self.handle)
	Line 3322:             BlzFrameSetText(self.handle, text)
	Line 3332:             return BlzFrameGetTextSizeLimit(self.handle)
	Line 3335:             BlzFrameSetTextSizeLimit(self.handle, size)
	Line 3345:             return BlzFrameGetValue(self.handle)
	Line 3348:             BlzFrameSetValue(self.handle, value)
	Line 3358:             return BlzFrameIsVisible(self.handle)
	Line 3361:             BlzFrameSetVisible(self.handle, flag)
	Line 3371:             return BlzFrameGetWidth(self.handle)
	Line 3374:             BlzFrameSetSize(self.handle, width, self.height)
	Line 3380:     BlzFrameAddText(self.handle, text)
	Line 3384:     BlzFrameCageMouse(self.handle, enable)
	Line 3388:     BlzFrameClearAllPoints(self.handle)
	Line 3392:     BlzFrameClick(self.handle)
	Line 3396:     BlzDestroyFrame(self.handle)
	Line 3401:         BlzFrameGetChild(self.handle, index)
	Line 3405:     BlzFrameSetAbsPoint(self.handle, point, x, y)
	Line 3409:     BlzFrameSetAllPoints(self.handle, relative.handle)
	Line 3413:     BlzFrameSetAlpha(self.handle, alpha)
	Line 3417:     BlzFrameSetEnable(self.handle, flag)
	Line 3421:     BlzFrameSetFocus(self.handle, flag)
	Line 3425:     BlzFrameSetFont(self.handle, filename, height, flags)
	Line 3429:     BlzFrameSetSize(self.handle, self.width, height)
	Line 3433:     BlzFrameSetLevel(self.handle, level)
	Line 3437:     BlzFrameSetMinMaxValue(self.handle, minValue, maxValue)
	Line 3441:     BlzFrameSetModel(self.handle, modelFile, cameraIndex)
	Line 3445:     BlzFrameSetParent(self.handle, parent.handle)
	Line 3449:     BlzFrameSetPoint(self.handle, point, relative.handle, relativePoint, x, y)
	Line 3453:     BlzFrameSetScale(self.handle, scale)
	Line 3457:     BlzFrameSetSize(self.handle, width, height)
	Line 3461:     BlzFrameSetSpriteAnimate(self.handle, primaryProp, flags)
	Line 3465:     BlzFrameSetStepSize(self.handle, stepSize)
	Line 3469:     BlzFrameSetText(self.handle, text)
	Line 3473:     BlzFrameSetTextColor(self.handle, color)
	Line 3477:     BlzFrameSetTextSizeLimit(self.handle, size)
	Line 3481:     BlzFrameSetTexture(self.handle, texFile, flag, blend)
	Line 3485:     BlzFrameSetTooltip(self.handle, tooltip.handle)
	Line 3489:     BlzFrameSetValue(self.handle, value)
	Line 3493:     BlzFrameSetVertexColor(self.handle, color)
	Line 3497:     BlzFrameSetVisible(self.handle, flag)
	Line 3501:     BlzFrameSetSize(self.handle, width, self.height)
	Line 3505:     BlzEnableUIAutoPosition(enable)
	Line 3509:         BlzGetTriggerFrame()
	Line 3517:         BlzGetFrameByName(name, createContext)
	Line 3522:         BlzGetOriginFrame(frameType, index)
	Line 3526:     return BlzGetTriggerFrameEvent()
	Line 3529:     return BlzGetTriggerFrameValue()
	Line 3532:     return BlzGetTriggerFrameValue()
	Line 3535:     BlzHideOriginFrames(enable)
	Line 3538:     return BlzLoadTOCFile(filename)
	Line 3665:             ((skinId and (function() return BlzCreateItemWithSkin(itemId, x, y, skinId) end)) or (function() return CreateItem(itemId, x, y) end))()
	Line 3713:             BlzSetItemName(self.handle, value)
	Line 3792:             return BlzGetItemSkin(self.handle)
	Line 3795:             BlzSetItemSkin(self.handle, skinId)
	Line 3827:     BlzItemAddAbility(self.handle, abilCode)
	Line 3856:         return BlzGetItemBooleanField(self.handle, field)
	Line 3860:         return BlzGetItemIntegerField(self.handle, field)
	Line 3864:         return BlzGetItemRealField(self.handle, field)
	Line 3868:         return BlzGetItemStringField(self.handle, field)
	Line 3909:         return BlzSetItemBooleanField(self.handle, field, value)
	Line 3911:         return BlzSetItemIntegerField(self.handle, field, value)
	Line 3913:         return BlzSetItemRealField(self.handle, field, value)
	Line 3915:         return BlzSetItemStringField(self.handle, field, value)
	Line 4114:             ((skinId and (function() return BlzCreateUnitWithSkin(p, unitId, x, y, face, skinId) end)) or (function() return CreateUnit(p, unitId, x, y, face) end))()
	Line 4149:             return BlzGetUnitArmor(self.handle)
	Line 4152:             BlzSetUnitArmor(self.handle, armorAmount)
	Line 4175:             return BlzGetUnitCollisionSize(self.handle)
	Line 4334:             return BlzIsUnitInvulnerable(self.handle)
	Line 4357:             return BlzGetLocalUnitZ(self.handle)
	Line 4380:             return BlzGetUnitMaxHP(self.handle)
	Line 4383:             BlzSetUnitMaxHP(self.handle, value)
	Line 4393:             return BlzGetUnitMaxMana(self.handle)
	Line 4396:             BlzSetUnitMaxMana(self.handle, value)
	Line 4422:             BlzSetUnitName(self.handle, value)
	Line 4435:             BlzSetHeroProperName(self.handle, value)
	Line 4570:             return BlzIsUnitSelectable(self.handle)
	Line 4607:             return BlzGetUnitSkin(self.handle)
	Line 4610:             BlzSetUnitSkin(self.handle, skinId)
	Line 4731:             return BlzGetUnitZ(self.handle)
	Line 4781:     BlzUnitCancelTimedLife(self.handle)
	Line 4802:     BlzUnitDisableAbility(self.handle, abilId, flag, hideUI)
	Line 4814:     BlzEndUnitAbilityCooldown(self.handle, abilCode)
	Line 4817:     return BlzGetUnitAbility(self.handle, abilId)
	Line 4820:     return BlzGetUnitAbilityByIndex(self.handle, index)
	Line 4823:     return BlzGetUnitAbilityCooldown(self.handle, abilId, level)
	Line 4826:     return BlzGetUnitAbilityCooldownRemaining(self.handle, abilId)
	Line 4832:     return BlzGetUnitAbilityManaCost(self.handle, abilId, level)
	Line 4838:     return BlzGetUnitAttackCooldown(self.handle, weaponIndex)
	Line 4841:     return BlzGetUnitBaseDamage(self.handle, weaponIndex)
	Line 4844:     return BlzGetUnitDiceNumber(self.handle, weaponIndex)
	Line 4847:     return BlzGetUnitDiceSides(self.handle, weaponIndex)
	Line 4875:         return BlzGetUnitBooleanField(self.handle, fieldBool)
	Line 4880:         return BlzGetUnitIntegerField(self.handle, fieldInt)
	Line 4885:         return BlzGetUnitRealField(self.handle, fieldReal)
	Line 4890:         return BlzGetUnitStringField(self.handle, fieldString)
	Line 4928:     BlzUnitHideAbility(self.handle, abilId, flag)
	Line 4949:     BlzUnitInterruptAttack(self.handle)
	Line 5027:     BlzPauseUnitEx(self.handle, flag)
	Line 5086:     BlzSetUnitAbilityCooldown(self.handle, abilId, level, cooldown)
	Line 5092:     BlzSetUnitAbilityManaCost(self.handle, abilId, level, manaCost)
	Line 5108:     BlzSetUnitAttackCooldown(self.handle, cooldown, weaponIndex)
	Line 5111:     BlzSetUnitBaseDamage(self.handle, baseDamage, weaponIndex)
	Line 5123:     BlzSetUnitDiceNumber(self.handle, diceNumber, weaponIndex)
	Line 5126:     BlzSetUnitDiceSides(self.handle, diceSides, weaponIndex)
	Line 5135:     BlzSetUnitFacingEx(self.handle, facingAngle)
	Line 5149:         return BlzSetUnitBooleanField(self.handle, field, value)
	Line 5151:         return BlzSetUnitIntegerField(self.handle, field, value)
	Line 5153:         return BlzSetUnitRealField(self.handle, field, value)
	Line 5155:         return BlzSetUnitStringField(self.handle, field, value)
	Line 5199:     BlzSetUnitAttackCooldown(self.handle, cooldown, weaponIndex)
	Line 5220:     BlzShowUnitTeamGlow(self.handle, show)
	Line 5223:     BlzStartUnitAbilityCooldown(self.handle, abilCode, cooldown)
	Line 5327:             return BlzGroupGetSize(self.handle)
	Line 5333:     return BlzGroupAddGroupFast(self.handle, addGroup.handle)
	Line 5440:         BlzGroupUnitAt(self.handle, index)
	Line 5475:     return BlzGroupRemoveGroupFast(self.handle, removeGroup.handle)
	Line 6386:     return BlzTriggerRegisterPlayerKeyEvent(self.handle, whichPlayer.handle, whichKey, metaKey, fireOnKeyDown)
	Line 6395:     return BlzTriggerRegisterPlayerSyncEvent(self.handle, whichPlayer.handle, prefix, fromServer)
	Line 6453:     return BlzTriggerRegisterFrameEvent(self.handle, frame.handle, eventId)
	Line 7002:     local originalIcon = BlzGetAbilityIcon(self.dummyAbility)
	Line 7004:     local preloadText = BlzGetAbilityIcon(self.dummyAbility)
	Line 7005:     BlzSetAbilityIcon(self.dummyAbility, originalIcon)
	Line 7033:             ("\")\n//! beginusercode\nBlzSetAbilityIcon(" .. tostring(self.dummyAbility)) .. ",o)\n//!endusercode\n//"
	Line 7230:     if (self.from == MapPlayer:fromLocal()) and (not BlzSendSyncData(
	Line 7265:         BlzGetTriggerSyncPrefix(),
	Line 7266:         BlzGetTriggerSyncData()
	Line 8773:             BlzTriggerRegisterPlayerKeyEvent(
Зная функционал луа на 1.26, то нет, пока что возможности даже через аналоги такое запустить - нет
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.