Для тех кто незнает - напомню, это функция которая позволяет создать псевдо-объект по указанным координатам, что бывает очень удобно.
Code: Usage: mfgi [resend/info/clear/add graphic [x y z] [color] [name]]
У этой функции есть большой недостаток - нельзя удалить конкретный созданный объект, что я и попытался исправить. Теперь можно задать некоторые характеристики псевдо-объекта (расположение на карте, название, тип) и все псевдо-объекты подходящие им будут удалены. Так же можно удалить объект по его ID который возвращает функция.
Code: Sub Des.Mfgi.Init(len) ; Инициализация Des.Mfgi.* функций. ; len(INT) - максимальная длинна названия псевдо-тайла uo.SetGlobal("Des.Mfgi.Name-L",str(len)) uo.SetGlobal("Des.Mfgi.Tile-T",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Tile-X",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Tile-Y",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Tile-Z",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Tile-C",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Tile-N",RegArray(0,5)) uo.SetGlobal("Des.Mfgi.Obj-ID",RegArray(0,6)) endsub
Sub Des.Mfgi.DropById(id) ; Удаление элемента по ID ; id - INT, возвращается из функции Des.Mfgi.Add id = str(id) var ids = uo.GetGlobal("Des.Mfgi.Obj-ID") var nL = uo.GetGlobal("Des.Mfgi.Name-L") var gT = uo.GetGlobal("Des.Mfgi.Tile-T") var gX = uo.GetGlobal("Des.Mfgi.Tile-X") var gY = uo.GetGlobal("Des.Mfgi.Tile-Y") var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z") var gC = uo.GetGlobal("Des.Mfgi.Tile-C") var gN = uo.GetGlobal("Des.Mfgi.Tile-N") Des.Mfgi.Clear() var i,t,x,y,z,c,n,o for i=0 to ArrLen(ids,6)-1 t = GetArray(gT, i, 5) x = GetArray(gX, i, 5) y = GetArray(gY, i, 5) z = GetArray(gZ, i, 5) c = GetArray(gC, i, 5) n = GetArray(gN, i, val(nL)) o = GetArray(ids, i, 6) if NOT o == id Then Des.Mfgi.Add(val(t),val(x),val(y),val(z),val(c),n,o) endif next endsub
Sub Des.Mfgi.Add(t,x,y,z,c,n,id) ; Создание нового псевдо-объекта ; t - тип псевдо-тайла Int[Dec] ; x,y,z - координаты Int[Dec] ; c - цвет Int[Dec] ; n - название Text ; id - номер объекта, или нуль если не надо. Лучше не играться. ; false - не указано, согласно документации по uo.mfgi("add") if x == false || y == false Then x = "" y = "" z = "" else x = str(x) y = str(y) z = str(z) endif if c == false Then c = "" else c = str(c) endif if n == false Then n = "" endif if NOT id Then id = str(ArrLen(oI,6)) else id = str(id) endif t = str(t) uo.Exec("mfgi add "+t+" "+x+" "+y+" "+z+" "+c+" "+n) var nL = uo.GetGlobal("Des.Mfgi.Name-L") var gT = uo.GetGlobal("Des.Mfgi.Tile-T") var gX = uo.GetGlobal("Des.Mfgi.Tile-X") var gY = uo.GetGlobal("Des.Mfgi.Tile-Y") var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z") var gC = uo.GetGlobal("Des.Mfgi.Tile-C") var gN = uo.GetGlobal("Des.Mfgi.Tile-N") var oI = uo.GetGlobal("Des.Mfgi.Obj-ID") gT = IncArray(gT, 1, 5) gT = SetArray(t, gT, ArrLen(gT,5)-1, 5) gX = IncArray(gX, 1, 5) gX = SetArray(x, gX, ArrLen(gX,5)-1, 5) gY = IncArray(gY, 1, 5) gY = SetArray(y, gY, ArrLen(gY,5)-1, 5) gZ = IncArray(gZ, 1, 5) gZ = SetArray(z, gZ, ArrLen(gZ,5)-1, 5) gC = IncArray(gC, 1, 5) gC = SetArray(c, gC, ArrLen(gC,5)-1, 5) gN = IncArray(gN, 1, val(nL)) gN = SetArray(n, gN, ArrLen(gN,val(nL))-1, val(nL)) oI = IncArray(oI, 1, 6) oI = SetArray(id, oI, ArrLen(oI,6)-1, 6) uo.SetGlobal("Des.Mfgi.Tile-T",gT) uo.SetGlobal("Des.Mfgi.Tile-X",gX) uo.SetGlobal("Des.Mfgi.Tile-Y",gY) uo.SetGlobal("Des.Mfgi.Tile-Z",gZ) uo.SetGlobal("Des.Mfgi.Tile-C",gC) uo.SetGlobal("Des.Mfgi.Tile-N",gN) return val(id) endsub
Sub Des.Mfgi.Drop(Rt,Rx,Ry,Rz,Rc,Rn) ; Удаление псевдо-объектов подходящих условиям ; Rt,Rx,Ry,Rz,Rc,Rn - параметры тайла для дропа, false - не указано. var nL = uo.GetGlobal("Des.Mfgi.Name-L") var gT = uo.GetGlobal("Des.Mfgi.Tile-T") var gX = uo.GetGlobal("Des.Mfgi.Tile-X") var gY = uo.GetGlobal("Des.Mfgi.Tile-Y") var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z") var gC = uo.GetGlobal("Des.Mfgi.Tile-C") var gN = uo.GetGlobal("Des.Mfgi.Tile-N") var oI = uo.GetGlobal("Des.Mfgi.Obj-ID") if Rx == false || Ry == false Then Rx = "" Ry = "" Rz = "" else Rx = str(Rx) Ry = str(Ry) Rz = str(Rz) endif if Rc == false Then Rc = "" else Rc = str(Rc) endif if Rn == false Then Rn = "" endif Rt = str(Rt) Des.Mfgi.Clear() var i,t,x,y,z,c,n,o for i=0 to ArrLen(gT,5)-1 t = GetArray(gT, i, 5) x = GetArray(gX, i, 5) y = GetArray(gY, i, 5) z = GetArray(gZ, i, 5) c = GetArray(gC, i, 5) n = GetArray(gN, i, val(nL)) o = GetArray(oI, i, 6) if NOT ((Rt == "" || Rt==t) && (Rx == "" || Rx == x) && (Ry == "" || Ry == y) && (Rz == "" || Rz == z) && (Rc == "" || Rc == c) && (Rn == "" || Rn == n)) Then Des.Mfgi.Add(val(t),val(x),val(y),val(z),val(c),n,o) endif next endsub
Sub Des.Mfgi.Clear() ; Удаление всех псевдо-объектов var nL = uo.GetGlobal("Des.Mfgi.Name-L") uo.Exec("mfgi clear") Des.Mfgi.Init(val(nL)) endsub
Демонстрирующий пример:
Code: sub main() Des.Mfgi.Init(25) ; инициализируем функции, длинна названия псевдо-объекта = 25 Des.Mfgi.Clear() ; удаляем все псевдо-объекты DIM mf1[6] ; создаём массив с данными первого псведо-объекта mf1[0] = 1295 ; тип псевдо-объекта mf1[1] = uo.getX() ; X-координата псевдо-объекта mf1[2] = uo.getY() ; Y-координата псевдо-объекта mf1[3] = uo.getZ() ; Z-координата псевдо-объекта mf1[4] = 76 ; Цвет псевдо-объекта mf1[5] = "Fake Added Tile[1]" ; название псевдо-объекта DIM mf2[6] mf2[0] = 1295 mf2[1] = uo.getX()+2 mf2[2] = uo.getY()+2 mf2[3] = uo.getZ() mf2[4] = 76 mf2[5] = "Fake Added Tile[2]" uo.print("Первый тайл добавлен") Des.Mfgi.Add(mf1[0],mf1[1],mf1[2],mf1[3],mf1[4],mf1[5],0) ; создаём первый псевдо-объект wait(5000) uo.print("Второй тайл добавлен") var id = Des.Mfgi.Add(mf2[0],mf2[1],mf2[2],mf2[3],mf2[4],mf2[5],0) ; создаём второй псевдо-объект wait(5000) uo.print("Второй тайл удалён") Des.Mfgi.DropById(id) ; удалём второй псевдо-объект wait(5000) uo.print("Первый тайл удалён") Des.Mfgi.Drop(mf1[0],mf1[1],mf1[2],mf1[3],mf1[4],mf1[5]); удаляем первый псевдо-объект endsub
Скрипт использует мои функции псевдо-массивов, которые по-прежнему можно найти здесь:
viewtopic.php?p=40623
|