,

Гильдия «Черамор»: Библиотека Lua-Warcraft3

Библиотека Lua-Warcraft3
» Раздел: WarCraft III

» Другое
function B2I(b)
return b and 1 or 0
end
-- Т.к. нет в LUA math.round(), nazarpunk запилил вот такой аналог
function math.round(n)
    return n % 1 >= 0.5 and math.ceil(n) or math.floor(n)
end
» usertype (костыльный аналог type )
Вариант №1
function usertype(ptr)
    local typ = type(ptr)
    if typ == "userdata" then
        typ = string.match(tostring(ptr),"([^%%s]+):")
        if typ == nil then
            typ = string.match(tostring(ptr),"([^%%s]+)")
        end
    end
    return typ
end
Вариант №2
type_orig  = type
function type(ptr)
    local typ = type_orig(ptr)
    if typ == "userdata" then
        typ = string.match(tostring(ptr),"([^%%s]+):")
        if typ == nil then
            typ = string.match(tostring(ptr),"([^%%s]+)")
        end
    end
    return typ
end
» new - удобное создание объектов для сверхразумов
new = {
timer       = CreateTimer,
group       = CreateGroup,
unit        = CreateUnit,
force       = CreateForce,
lightning   = AddLightning,
elightning  = AddLightningEx,
multiboard  = CreateMultiboard,
leaderboard = CreateLeaderboard,
ubersplat   = CreateUbersplat,
image       = CreateImage,
loc         = Location,
rect        = Rect,
region      = CreateRegion,
item        = CreateItem,
filter      = Filter,
cond        = Condition,
quest       = CreateQuest,
mark        = CreateQuestItem,
defcond     = CreateDefeatCondition,
dialog      = CreateDialog,
clock       = CreateTimerDialog,
tag         = CreateTextTag,
trigger     = CreateTrigger,
action      = TriggerAddAction,
tcond       = TriggerAddCondition,
button      = DialogAddButton,
frame       = BlzCreateFrame,
frame_s     = BlzCreateSimpleFrame,
frame_ex    = BlzCreateFrameByType,
cache       = InitGameCache,
hash        = InitHashtable,
dest        = CreateDestructable,
dest_z      = CreateDestructableZ,
dest_d      = CreateDeadDestructable,
dest_dz     = CreateDeadDestructableZ,
weather     = AddWeatherEffect,
track       = CreateTrackable,
effect      = AddSpecialEffect,
effect_l    = AddSpecialEffectLoc,
effect_t    = AddSpecialEffectTarget,
fogrect     = CreateFogModifierRect,
fogradius   = CreateFogModifierRadius,
fogradloc   = CreateFogModifierRadiusLoc,
gift        = CreateItemPool,              -- itempool        = CreateItemPool
mob         = CreateUnitPool,              -- unitpool        = CreateUnitPool
}
» free () - удаление объектов
freetab = {
["unit"]=RemoveUnit,
["timer"]=DestroyTimer,
["texttag"]=DestroyTexttag,
["quest"]=DestroyQuest,
["lightning"]=DestroyLightning,
["item"]=RemoveItem,
["fogmodifier"]=DestroyFogModifier,
["dialog"]=DialogDestroy,
["unitpool"]=DestroyUnitPool,
["itempool"]=DestroyItemPool,
["defeatcondition"]=DestroyDefeatCondition,
["timerdialog"]=DestroyTimerDialog,
["leaderboard"]=DestroyLeaderboard,
["multiboard"]=DestroyMultiboard,
["effect"]=DestroyEffect,
["image"]=DestroyImage,
["ubersplat"]=DestroyUbersplat,
["framehandle"]=BlzDestroyFrame,
["group"]=DestroyGroup,
["force"]=DestroyForce,
["trigger"]=DestroyTrigger,
["conditionfunc"]=DestroyCondition,
["filterfunc"]=DestroyFilter,
["boolexpr"]=DestroyBoolExpr,
["rect"]=RemoveRect,
["region"]=RemoveRegion,
["location"]=RemoveLocation,
["triggercondition"]=TriggerRemoveCondition,
["triggeraction"]=TriggerRemoveAction,
["destructable"]=RemoveDestructable,
["weathereffect"]=RemoveWeatherEffect
}

function free(hdl,...)
    str = type(hdl)
	if str == "timer" then
		local b = ...
		if b then
			PauseTimer(hdl)
		end
	end
	if str == "triggercondition" or str == "triggeraction" then
		local t = ...
		if type(t) == "trigger" then
			freetab[str](t,hdl)
		end
       return
	end
	freetab[str](hdl)
end
Другой вариант самой функции free():
function free(hdl,...)
    str = usertype(hdl)
	if str == "timer" then
		local b = ...
		if b then
			PauseTimer(hdl)
		end
	end
	if str == "triggercondition" or str == "triggeraction" then
		local t = ...
		if usertype(t) == "trigger" then
			freetab[str](t,hdl)
		end
        return
	end
	freetab[str](hdl)
end
Мультидоска:
» Board.lua Alpha (Ведутся работы над ней)
Это всего лишь демо-код
Board {
    multiboard = nil,
    multiboarditem = nil,
    counter = nil,
    counter_rowsize = 0
}

function Board:Counters(rows,cols)
    self.counter = {}
    local fin = rows*cols
    self.counter_rowsize = rows
    for i=1, fin do
        self.counter[i] = 0
    end
end

function Board:Inc(row,col)
    local id = math.tointeger(self.counter_rowsize*row + col + 1 )
    self.counter[id] = self.counter[id] + 1
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemValue( self.multiboarditem, self.counter[id] )
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:Dec(row,col)
    local id = math.tointeger(self.counter_rowsize*row + col + 1 )
    self.counter[id] = self.counter[id] - 1
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemValue( self.multiboarditem, self.counter[id] )
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:GetCounter(row,col)
    local id = math.tointeger(self.counter_rowsize*row + col + 1 )
    return self.counter[id]
end

function Board:Text( row, col ,text )
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemValue( self.multiboarditem, value )
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:Icon( row, col, path )
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemValue( self.multiboarditem, value )
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:Style( row, col, swText, swIcon )
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemStyle(self.multiboarditem, swText, swIcon)
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:Color( row, col, trgb )
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemValueColor(self.multiboarditem, tgrb.red, tgrb.green, tgrb.blue, 255)
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:Width( row, col, size )
    self.multiboard = MultiboardGetItem( multiboard, row, col )
    MultiboardSetItemWidth( self.multiboarditem, size / 100 )
    MultiboardReleaseItem( self.multiboarditem )
end

function Board:create(o,rows,cols,title)
    o = o or {}
    rows = rows or 1
    cols = cols or 1
    titile = title or "Custom Multiboard"
    setmetatable(o, self)
    self.__index = self

    o.multiboard = CreateMultiboard()
    MultiboardSetColumnCount(o.multiboard, cols)
    MultiboardSetRowCount(o.multiboard, rows)
    MultiboardSetItemsStyle(o.multiboard, true, false)
    MultiboardSetItemsWidth(o.multiboard, 100 * 0.025)
    MultiboardDisplay(o.multiboard, true)
    MultiboardMinimize(o.multiboard, false)
 return o
end
» Мультидоска-Фрейм (Никто не брался)
Сводка: Ещё не решили делать доску, которая будет в корне отличаться от стандартной, где вы сможете объединять ячейки. Выравнивать ячейки как надо, не сбивая размеры и местоложения других, как это бывало в старой доске.
Работа со строками
» tchar.lua
Приспособил к WE: KingMaximax, предоставил NazarPunk
Автор скрипта: Неизвестен (Точный автор уж явно)
Скачайте общий архив LUAWELIB.zip, извлеки с него tchar.lua, затем откройте, пото скопируйте код в триггерный сценарий, который вы назовёте к примеру TCHAR или UTF, если не хотите архив качать, то скачивайте отдельно tchar.lua
ВНИМАНИЕ:
Этот код требует сл. костыля, который вы можете вставить в общий нестандартный сценарий, который открывается, когда вы щёлкаете по значку карты в триггерах.
function error(errstr)
  print([[|cffcb0404ERROR:|r
|cffffcc00]]..errstr.."|r")
end
» code
tchar.len()
tchar.sub()
tchar.reverse()
tchar.char()
tchar.unicode()
tchar.gensub()
tchar.byte()
tchar.find()
tchar.match()
tchar.gmatch()
tchar.gsub()
tchar.dump()
tchar.format()
tchar.lower()      
tchar.upper()  
tchar.rep()
tchar.replace()

Просмотров: 423

NazarPunk #1 - 4 месяца назад (отредактировано ) 2
Что за тупое именование функций NzrRound(n)? Назвали бы math.round и не мучались.
Писать EmmyDoc к аргументам и возвращаемым значениям признак хорошего тона, можете посмотреть как сделано здесь.
PT153 #2 - 4 месяца назад (отредактировано ) 1
Что такое "сл." и где сам код?
прикреплены файлы
8gabriel8 #3 - 4 месяца назад 0
Прикреплён же
PT153 #4 - 4 месяца назад 0
Прикреплён же
Ну сейчас уже написано)
Скачайте общий архив LUAWELIB.zip, извлеки с него tchar.lua, затем откройте, пото скопируйте код в триггерный сценарий, который вы назовёте к примеру TCHAR или UTF, если не хотите архив качать, то скачивайте отдельно tchar.lua
Naadir #5 - 4 месяца назад 0
PT153, походу "следующего".
KingMaximax #6 - 3 месяца назад (отредактировано ) 0

Мизерное обновление

  • Добавлен костыльный аналог type() определитель типов.
» usertype
function usertype(ptr)
    if type(ptr) == "userdata" then
        local xtr = string.match(tostring(ptr),"([^%%s]+):")
        if xtr == nil then
            xtr = string.match(tostring(ptr),"([^%%s]+)")
        end
        return xtr
    else
       return type(ptr)
    end
    return "none"
end
PT153 #7 - 3 месяца назад 0
KingMaximax, а зачем в конце ещё 1 return?
» раскрыть
function usertype(ptr)
    local typ = type(ptr)
    if typ == "userdata" then
        typ = string.match(tostring(ptr),"([^%%s]+):")
        if typ == nil then
            typ = string.match(tostring(ptr),"([^%%s]+)")
        end
    end
    return typ
end
KingMaximax #8 - 3 месяца назад (отредактировано ) 0
PT153, ваши исправления приняты.
KingMaximax, а зачем в конце ещё 1 return?
Привычка, типа возвращает "none" в непредвиденных ситуациях, т.е. что якобы ничего не сделал или не получал, что-то вроде дебаг-ретурна. Пора бы избавится от этой вредной привычки.
А как насчёт такого варианта:
» раскрыть
otype = type
function type(ptr)
    local typ = otype(ptr)
    if typ == "userdata" then
        typ = string.match(tostring(ptr),"([^%%s]+):")
        if typ == nil then
            typ = string.match(tostring(ptr),"([^%%s]+)")
        end
    end
    return typ
end
PT153 #9 - 3 месяца назад 0
Привычка, типа возвращает "none" в непредвиденных ситуациях, т.е. что якобы ничего не сделал или не получал, что-то вроде дебаг-ретурна. Пора бы избавится от этой вредной привычки.
У тебя было 2 ветки: при true и при false, потому последний ретурн никогда бы не выполнился, это недосягаемый кусок кода.

Я бы назвал не optype, а type_orig.
KingMaximax #10 - 3 месяца назад 0
Я бы назвал не optype, а type_orig.
Вы правы, вдруг кто-нибудь захочет использовать имя otype для другого, а оно занято)

Обн.

Добавлена код функции free(), которая упрощает удаление объектов.
free(tmr,true) - удаляет таймер, но перед этим ставит его на паузу, просто free(tmr) - просто удаляет таймер.
Если хотите удалить triggercondition или triggeraction.
free(triggeraction,trigger), free(triggercondition,trigger)