Code: Select all
Usage: mfgi [resend/info/clear/add graphic [x y z] [color] [name]]
У этой функции есть большой недостаток - нельзя удалить конкретный созданный объект, что я и попытался исправить. Теперь можно задать некоторые характеристики псевдо-объекта (расположение на карте, название, тип) и все псевдо-объекты подходящие им будут удалены.
Так же можно удалить объект по его ID который возвращает функция.
Code: Select all
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: Select all
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